章鱼lua扩展模块

来源:互联网 发布:淘宝不搜血滴子上一句 编辑:程序博客网 时间:2024/06/11 20:57

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 :=  armeabiAPP_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 offcd /d %~dp0set "ARCH=arm"set "API=14"set VERSION=4.9set "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

相关文件下载

源码打包下载

0 0
原创粉丝点击