章鱼lua扩展模块

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

相关文件下载

源码打包下载

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骇客之技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值