1、lua绑定到C++,就是C++能调用到lua的东西,那必须让C++知道有哪些lua函数或变量可以用
2、C++绑定到lua,就是lua能调用到C++的东西,当然也必须让lua知道有哪些C++东东可以给lua调用,所谓的“暴露”
这里说的绑定就是第2种情况,在lua中能调用到Cocos2dx的函数。
Cocos2dx通过工程里面的tools/toLua工具生成注册C++函数到lua的函数cpp文件
二、环境设置
工具:
cocos2dx 3.8.1
NDK_ROOT 必须为android-ndk-r9d 64bit版Python 为32bit版,2.7.3版(因为有个插件是32位的(Cheetah),如果这个插件有64的,个人觉得用python64位没问题)
python插件:Cheetah、PyYAML(3.10以上版本、有32、64可选,但现在必选32)
PS:安装必要的库和工具包,以及配置相关环境变量,请按照cocos2d-x-3.0rc0\tools\tolua\README.mdown说得去做,不做赘述。
-----------------------------------------绑定环境配置好之后测试--------------------------------------------
1.创建纯cocos2dx lua工程:cocos new LuaTest -p com.chiu.hellolua -l lua -d D:\XXXXX,将2dx sdk下的tools文件夹拷至LuaTest frameworks cocos2d-x 下,原本生成的项目该文件夹是不全的,没有绑定的脚本等等。
2.编写测试Cpp类TestCpp
3.编写绑定脚本genbindings.py(可重命名)和.ini配置
a.tolua++ 工具的路径:tolua_root = '%s/tools/tolua' % project_root 运行脚本放到tools文件夹下此处不用修改
b.输出绑定生成文件(.cpp和.hpp)路径(根据需要修改,此处是我自己的):‘%s/tests/lua-empty-test/project/Classes/auto’ % project_root
c.修改cmd_args参数:第一个参数是ini文件名(我的是'testCpptoLua.ini'),第二个参数包含两部分,第一部分对应ini文件首行内容,如[cocos2dx].一般是第一行,形如 我的参数cmd_args={'testCpptoLua':('testCpptoLua','lua_testCpptoLua_auto')},含义就是查找testCpptoLua.ini中的[testCpptoLua]字段配置,最后生成的.hpp .cpp以 lua_testCpptoLua_auto命名。如果第二个参数对应不上,会出现Section not found in configfile的错误。
d..ini文件的修改:prefix 关系到lua函数开头的名字,如此处我测试用例则写prefix=testCpptoLua. 那么上述所说绑定生成的.hpp .cpp则以lua_testCpptoLua开头。另 外,ini还需修改的字段是headers,即为需要绑定生成的C++类头文件地址,如我写的:headers = %(cocosdir)s/../Classes/TestCpp.h,也就是放在工程Classes文件 夹下。最后修改的字段为classes,也就是你绑定的C++类名,如我的写:classes = TestCpp. 注意PS:headers和classes配置多个类,headers用%字符连接.h,classes用*连接多个类名 ,有多个就写多少个
4.当前目录下运行cmd,并执行脚本命令: python genbindings.py,如出现bindings succeeds说明生成成功。如提示Fails,则说明失败,根据错误提示修改.py 或者 .ini配置文件
5.将生成的lua_testCpptoLua_auto.hpp lua_testCpptoLua_auto.cpp 以及原C++ TestCpp.h TestCpp.cpp四个文件拷贝到Classes目录下(当然地址可以随意放置,只需在工程添加正确的引用位置即可),并添加四个文件到工程Classes下
6.注册TestCpp类接口给lua
<span style="font-family:Microsoft YaHei;font-size:14px;">#include "lua_testCpptoLua_auto.hpp"</span>注册TestCpp类:
<span style="font-family:Microsoft YaHei;font-size:14px;">register_all_testCpptoLua(stack->getLuaState());</span>
6.在lua代码中加入测试调用TestCpp的方法,纯lua的cocos2dx 工程可以看到Appdelegate是执行了engine->executeScriptFile("src/main.lua"),所以在main.lua下加入测试代码即可:
local function main() require("app.MyApp"):create():run() local test = TestCpp:create("GuoKun Chiu"); test:printCurName(); end
7.测试结果会打印出:TestCpp success,cur name is GuoKun Chiu