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


Lua的堆栈和全局表

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



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

堆栈的索引

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

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

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

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

  2. 负数索引,不需要知道栈的大小,我们就能知道栈顶在哪,栈顶的索引永远是-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)
阅读更多
换一批

没有更多推荐了,返回首页