因为lua和c++无法直接通信,所以要实现相互调用的需要有一个方法、渠道来互相沟通,堆栈和全局表就是这个渠道。
图画的不准确,堆栈在lua中。
我们很明显的看到堆栈的索引方式有两种,一种是正数索引,一种是负数索引。
正数索引,栈底是1,然后一直到栈顶是逐渐+1,最后变成9(9大于1) 负数索引,栈底是-9,然后一直到栈顶是逐渐+1,最后变成-1(-1大于-9)这样就设置索引的好处是:
正数索引,不需要知道栈的大小,我们就能知道栈底在哪,栈底的索引永远是1
负数索引,不需要知道栈的大小,我们就能知道栈顶在哪,栈顶的索引永远是-1
例:
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 中注册、编译时,会提示无法找到该函数,原因未知。所以,不要声明为静态
在项目文件..\frameworks\runtime-src\proj.android\jni中找到Android.mk,在LOCALSRCFILES := \ 后加入.cpp文件的路径即可。 可用模糊路径和绝对路径。 例:../../Classes/Hellolua.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);