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 := sdk
LOCAL_SRC_FILES := libsdk.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE_FILENAME :=mytestlib
LOCAL_MODULE :=mytestlib
LOCAL_SHARED_LIBRARIES:=sdk
LOCAL_LDLIBS:=-lm -llog -lz -ljnigraphics
LOCAL_SRC_FILES :=mytestlib.c
include $(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