1.安装ndk并设置环境变量
2.切换到project/jni目录下运行ndk-build

注意:需要把so放到某个目录中,我这里是 /data/local/tmp !!!
例如: adb push mytestlib.so /data/local/tmp

效果图

章鱼lua扩展模块 - 图1
章鱼lua扩展模块 - 图2

相关文件

mytestlib.c文件

  1. //lua核心API声明
  2. #include "lua.h"
  3. //lua辅助库API声明
  4. #include "lauxlib.h"
  5. //lua库声明
  6. #include "lualib.h"
  7. // 待注册的C函数,该函数的声明形式在上面的例子中已经给出。
  8. static int add(lua_State *L)
  9. {
  10. double op1 = luaL_checknumber(L,1);
  11. double op2 = luaL_checknumber(L,2);
  12. lua_pushnumber(L,op1 + op2);
  13. return 1;
  14. }
  15. static int sub(lua_State *L)
  16. {
  17. double op1 = luaL_checknumber(L,1);
  18. double op2 = luaL_checknumber(L,2);
  19. lua_pushnumber(L,op1 - op2);
  20. return 1;
  21. }
  22. // luaL_Reg结构体的第一个字段为字符串,在注册时用于通知Lua该函数的名字。
  23. // 第一个字段为C函数指针。
  24. // 结构体数组中的最后一个元素的两个字段均为NULL,用于提示Lua注册函数已经到达数组的末尾。
  25. static const luaL_Reg mylibs[] = {
  26. {"add", add},
  27. {"sub", sub},
  28. {NULL, NULL}
  29. };
  30. // 该C库的唯一入口函数。其函数签名等同于上面的注册函数。见如下几点说明:
  31. // 1. 我们可以将该函数简单的理解为模块的工厂函数。
  32. // 2. 其函数名必须为luaopen_xxx,其中xxx表示library名称。Lua代码require xxx需要与之对应。
  33. // 3. 在luaL_register的调用中,其第一个字符串参数为模块名xxx,第二个参数为待注册函数的数组。
  34. // 4. 需要强调的是,所有需要用到xxx的代码,不论C还是Lua,都必须保持一致,这是Lua的约定,
  35. // 否则将无法调用。
  36. extern int luaopen_mytestlib(lua_State *L)
  37. {
  38. luaL_newlib(L, mylibs);
  39. //_G["mytestlib"]= mylibs 可选择
  40. lua_pushvalue(L, -1);
  41. lua_setglobal(L, "mytestlib"); /* the module name */
  42. return 1;
  43. }

Android.mk文件

  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_MODULE := sdk
  4. LOCAL_SRC_FILES := libsdk.so
  5. include $(PREBUILT_SHARED_LIBRARY)
  6. include $(CLEAR_VARS)
  7. LOCAL_MODULE_FILENAME :=mytestlib
  8. LOCAL_MODULE :=mytestlib
  9. LOCAL_SHARED_LIBRARIES:=sdk
  10. LOCAL_LDLIBS:=-lm -llog -lz -ljnigraphics
  11. LOCAL_SRC_FILES :=mytestlib.c
  12. 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

相关文件下载

源码打包下载