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)