Cocos2dx通过工程里面的tools/toLua工具生成注册C++函数到lua的函数cpp文件
bindings-generator脚本的工作机制
- 不用编写.pkg和.h文件了,直接定义一个ini文件,注册到Lua环境里的模块名是什么,就行了。
- 摸清了toLua++工具的生成方法,改由Python脚本动态分析C++类,自动生成桥接的.h和.cpp代码,不调用tolua++命令了
- 虽然不再调用tolua++命令了,但是底层仍然使用toLua++的库函数,比如tolua_function,bindings-generator脚本生成的代码就跟使用toLua++工具生成的几乎一样
bindings-generator步骤
0.写自己的C++类,按照cocos2d-x的规矩,继承cocos2d::Ref类,以便使用cocos2d-x的内存回收机制。当然不这么干也行,但是不推荐,不然在Lua环境下对象的释放狠麻烦。首先是自定义的C++类。通常将文件保存在frameworks/runtime-src/Classes/目录下:
//MyClass.h文件
#include "cocos2d.h"
using namespace cocos2d;
class MyClass : public Ref
{
public:
MyClass() {};
~MyClass() {};
bool init() { return true; };
CREATE_FUNC(MyClass);
int foo(int i);
};
//MyClass.cpp文件
#include "MyClass.h"
int MyClass::foo(int i)
{
return i + 100;
}
1.按照官方提供的文档(\tools\tolua\ README.mdown)安装相应软件包
2.编写自已的脚本文件,拷贝\tools\tolua\genbindings.py, myClass.py修改如下地方
3、编写自已的配置文件,拷贝\tools\tolua\cocos2dx_spine.ini,让bindings-generator可以根据这个配置文件知道C++类该怎么暴露出来,myClass.ini修改如下地方
•[title]:要配置将被使用的工具/ tolua的/ gengindings.py脚本的称号。一般来说,标题可以是文件名。
•prefix:要配置一个函数名的前缀,通常,我们还可以使用文件名作为前缀。关系到lua函数开头的名字,如prefix=cocos2dx,那么生成的代码就是以lua_cocos2dx开头
•target_namespace:要配置在脚本层模块的名字。在这里,我们使用cc作为模块名,当你想在脚本层REF的名称,您必须将一个名为前缀,CC在名称的前面。例如,CustomClass可以参考作为cc.CustomClass。target_namespace=custom,那么在lua中调用就是以 custom. 开头(但这个参数好像控制不到,真正能控制的是在C++里面是否有custom的命名空间)
这里有两点要注意的
如果有自定义的命名空间,cocos2dx主目录的tools文件夹下bindings-generator\targets\lua下的conversions.yaml(js的是bindings-generator\targets\spidermonkey下的conversions.yaml)添加自己的命名空间:
ns_map:
"cocos2d::extension::": "cc."
"cocos2d::ui::": "ccui."
"cocos2d::": "cc."
"spine::": "sp."
"cocostudio::": "ccs."
"cocosbuilder::": "cc."
"CocosDenshion::": "cc."
"ccmy::": "ccmy."
这个文件貌似是一些替换操作配置(就是在生成C++文件中替换掉所设置的的字符串),自己研究一下就知道了。
•headers:要配置所有需要解析的头文件和%(cocosdir)s是的Cocos2d-x的引擎的根路径。
•classes:要配置所有绑定所需的类。在这里,它支持正则表达式。因此,我们可以设置MyCustomClass。*在这里,用于查找多个特定的用法,你可以对照到tools/tolua/cocos2dx.ini。
4、终端进入\tools\tolua, 执行刚修改的角本./genbindings_custom.py,成功后在output_dir指定目录会生成lua_xxx_auto.hpp,lua_xxx_auto.cpp等文件
5、把生成的文件添加至项目中,编辑AppDelegate.cpp文件,
a.包含lua_xxx_auto.hpp文件
b.在函数applicationDidFinishLaunching()中的函数register_all_packages(L);中添加lua_xxx_auto.hpp文件的函数register_xxx(L);
6.编写lua脚本调用
function myadd(x, y)
-- 自定义
local test = ccmy.MyClass:create()
print("lua bind: " .. test:foo(99))
return x + y
end
7.如果C++类定义了namespace,则需要修改frameworks/cocos2d-x/tools/bindings-generator/targets/lua/conversions.yaml文件,定义namespace与Lua之间的映射关系,否则会报conversion wasn't set错误:
8.因为创建之后,编译成apk时,需要找到对应的文件,需要在mk文件添加 不然编译的时候提示 " error: undefined reference to register_all_xxx" 未定义
#自己的android工程目录下jni/Android.mk文件添加
LOCAL_SRC_FILES := hellocpp/main.cpp \
../../Classes/AppDelegate.cpp \
../../Classes/xxx.cpp \