实现cocos2d-x v3.x lua 绑定 简单c++ 流程记录

    xiaoxiao2026-06-11  0

    Lua的堆栈和全局表

    因为lua和c++无法直接通信,所以要实现相互调用的需要有一个方法、渠道来互相沟通,堆栈和全局表就是这个渠道。

    图画的不准确,堆栈在lua中。

    堆栈的索引

    我们很明显的看到堆栈的索引方式有两种,一种是正数索引,一种是负数索引。

    正数索引,栈底是1,然后一直到栈顶是逐渐+1,最后变成9(9大于1) 负数索引,栈底是-9,然后一直到栈顶是逐渐+1,最后变成-1(-1大于-9)

    这样就设置索引的好处是:

    正数索引,不需要知道栈的大小,我们就能知道栈底在哪,栈底的索引永远是1

    负数索引,不需要知道栈的大小,我们就能知道栈顶在哪,栈顶的索引永远是-1

    1.定义.h头文件

    例:

    extern "C" { #include <lua.h> #include <lualib.h> #include <lauxlib.h> }; int HelloLua(lua_State *pL);//声明方法 int sd(lua_State *pL);//lua_state 是必须的,lua_state 是脚本上下文,具体的不了解

    因为Lua是C语言库,所以在C++中使用必须用extern “C”声明,让编译器知道。

    static int HelloLua(lua_State *pL); static int sd(lua_State *pL);

    如果使用静态声明函数,在APPdelegate.cpp 中注册、编译时,会提示无法找到该函数,原因未知。所以,不要声明为静态

    2.实现.cpp文件,完成函数具体实现方法

    #include "HelloLua.h" int HelloLua(lua_State *pL ) { int number = lua_tonumber(pL, 1);//获取堆栈中栈底的数值 number = number + 1;//数值加1 lua_pushnumber(pL, number);//把数值压入堆栈中 return 1;//表明返回的值的个数 } int sd(lua_State *pL ) { const char *string = lua_tostring(pL, 1);//获取堆栈中栈底的字符串 int a=lua_tonumber(pL,2);//获取堆栈中索引为2的数值 int b=lua_tonumber(pL,3);//获取堆栈中索引为3的数值 int sum=a+b;//求和 lua_pushnumber(pL, sum);//把和压入堆栈中 lua_pushnumber(pL, 666);//把666压入堆栈中 lua_pushstring(pL,string);//把字符串压入堆栈中 return 3;//返回的值的个数为3 }

    3.在Android.mk中引用.cpp文件,不引用函数无法找到。

    在项目文件..\frameworks\runtime-src\proj.android\jni中找到Android.mk,在LOCALSRCFILES := \ 后加入.cpp文件的路径即可。 可用模糊路径和绝对路径。 例:../../Classes/Hellolua.cpp \

    4.在Appdelegate.cpp中注册函数

    在项目文件..\frameworks\runtime-src\Classes中找到Appdelegate.cpp文件

    首先 在头部添加引用

    #include "HelloLua.h"

    因为Appdelegate.cpp已经留下注册函数的位置

    LuaStack* stack = engine->getLuaStack(); stack->setXXTEAKeyAndSign("2dxLua", strlen("2dxLua"), "XXTEA", strlen("XXTEA")); //register custom function //LuaStack* stack = engine->getLuaStack(); //register_custom_function(stack->getLuaState());

    所以在注释的下面就可以注册函数了

    lua_State *pL = stack->getLuaState();//get一个lua_state lua_register(pL, "sum", HelloLua);//参数解释:lua_state,在lua中引用的函数名称,c++中定义函数名称 lua_register(pL, "sd", sd);

    5.在lua中引用即可

    local i = sum(80)//使用c++中HelloLua函数 print("lua_bind_sum: " .. tostring(i))//输出 local d,s,k = sd(":WTF:你好",3,4)//使用sd函数,并传入3个参数 print("lua_bind_get: " .. tostring(s)..k) print("lua_sum:"..d)
    转载请注明原文地址: https://ju.6miu.com/read-1310425.html
    最新回复(0)