1.安装ndk并设置环境变量
2.切换到project/jni目录下运行ndk-build
注意:需要把so放到某个目录中,我这里是 /data/local/tmp !!!
例如: adb push mytestlib.so /data/local/tmp
效果图
相关文件
mytestlib.c文件
//lua核心API声明#include "lua.h"//lua辅助库API声明#include "lauxlib.h"//lua库声明#include "lualib.h"// 待注册的C函数,该函数的声明形式在上面的例子中已经给出。static int add(lua_State *L){double op1 = luaL_checknumber(L,1);double op2 = luaL_checknumber(L,2);lua_pushnumber(L,op1 + op2);return 1;}static int sub(lua_State *L){double op1 = luaL_checknumber(L,1);double op2 = luaL_checknumber(L,2);lua_pushnumber(L,op1 - op2);return 1;}// luaL_Reg结构体的第一个字段为字符串,在注册时用于通知Lua该函数的名字。// 第一个字段为C函数指针。// 结构体数组中的最后一个元素的两个字段均为NULL,用于提示Lua注册函数已经到达数组的末尾。static const luaL_Reg mylibs[] = {{"add", add},{"sub", sub},{NULL, NULL}};// 该C库的唯一入口函数。其函数签名等同于上面的注册函数。见如下几点说明:// 1. 我们可以将该函数简单的理解为模块的工厂函数。// 2. 其函数名必须为luaopen_xxx,其中xxx表示library名称。Lua代码require xxx需要与之对应。// 3. 在luaL_register的调用中,其第一个字符串参数为模块名xxx,第二个参数为待注册函数的数组。// 4. 需要强调的是,所有需要用到xxx的代码,不论C还是Lua,都必须保持一致,这是Lua的约定,// 否则将无法调用。extern int luaopen_mytestlib(lua_State *L){luaL_newlib(L, mylibs);//_G["mytestlib"]= mylibs 可选择lua_pushvalue(L, -1);lua_setglobal(L, "mytestlib"); /* the module name */return 1;}
Android.mk文件
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := sdkLOCAL_SRC_FILES := libsdk.soinclude $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)LOCAL_MODULE_FILENAME :=mytestlibLOCAL_MODULE :=mytestlibLOCAL_SHARED_LIBRARIES:=sdkLOCAL_LDLIBS:=-lm -llog -lz -ljnigraphicsLOCAL_SRC_FILES :=mytestlib.cinclude $(BUILD_SHARED_LIBRARY)
Application.mk文件(暂不支持X86)
APP_ABI := armeabi
APP_PLATFORM := android-14
libsdk.so文件
位于pc_debug.apk/octopus_sdk.apk/assets/solib/libsdk.so
测试文件
package.cpath = package.cpath ..";/data/local/tmp/?.so"
local test = require("mytestlib")
TracePrint(mytestlib.add(5,3))
TracePrint(test.add(5,3))
补充(自定义交叉编译工具 bat文件)
@echo off
cd /d %~dp0
set "ARCH=arm"
set "API=14"
set VERSION=4.9
set "NDKROOT=D:\android-ndk-r12b"
set "HOSTSYSTEM=windows-x86_64"
set "SOURCE=mytestlib.c"
set "TARGET=mytestlib.so"
set "CFLAGS=-L. -shared -lsdk -lm"
::以上可以自定义
set "SYSROOT=%NDKROOT%\platforms\android-%API%\arch-%ARCH%"
if %ARCH%==x86 (
set "CC=%NDKROOT%\toolchains\%ARCH%-%VERSION%\prebuilt\%HOSTSYSTEM%\bin\i686-linux-android-gcc.exe --sysroot=%SYSROOT%"
) else (
set "CC=%NDKROOT%\toolchains\%ARCH%-linux-androideabi-%VERSION%\prebuilt\%HOSTSYSTEM%\bin\%ARCH%-linux-androideabi-gcc.exe --sysroot=%SYSROOT%"
)
%CC% %CFLAGS% -o %TARGET% %SOURCE%
pause
