1.通过 genbindings.py 绑定
coco2d-x3.10
1.根据 README 选择对应的 NDK
android-ndk-r10c
2.出错找不到libclang
- ./frameworks/cocos2d-x/tools/bindings-generator/clang/cindex.py
第 3395 行改为 : library = cdll.LoadLibrary(“../bindings-generator/libclang/” + self.get_filename())
3.修改 .ini 文件
复制 cocos2dx_controller.ini 修改文件名 cocos2dx_test.ini
修改文件内容:
1. 第一行 [cocos2dx_test]
2. prefix = cocos2dx_test
3. target_namespace = cc 如果没有 target_namespace = 即可,有通过 cc.ClassName 调用
4. headers = %(cocosdir)s/../runtime-src/Classes/ClassName.h %(cocosdir)s/../runtime-src/Classes/ClassName2.h
5. classes = ClassName ClassName2
4.修改 genbindings.py
复制 genbindings.py 修改文件名 genbindings_test.py
修改:cmd_args = {‘cocos2dx_test.ini’ : (‘cocos2dx_test’, ‘lua_cocos2dx_test_auto’), \
}
2.自动绑定
1.通过源码查看 lua 的 api
XMLHttpRequest 为例
1.属性
赋值 xhr.timeout = 10、取值 xhr.timeout
tolua_variable(L, “timeout”, lua_get_XMLHttpRequest_timeout, lua_set_XMLHttpRequest_timeout);
只能取值
tolua_variable(L, “timeout”, lua_get_XMLHttpRequest_timeout, nullptr);
2.函数
xhr:open()
tolua_function(L, “open”, lua_cocos2dx_XMLHttpRequest_open);
3.查看参数个数
- lua 通过 send 方法调用 xhr:send() 或 xhr:send(“参数”) lua文件
- 执行 lua_cocos2dx_XMLHttpRequest_send 自动生成cpp文件
if ( 1 == argc )
判断如果有一个参数,没有参数执行下面的 自动生成cpp文件- 通过 LuaMinXmlHttpRequest 对象调用此类里的方法 自己写的cpp文件
static int lua_cocos2dx_XMLHttpRequest_send(lua_State* L)
{
int argc = 0;
LuaMinXmlHttpRequest* self = nullptr;
//std::string data = "";
const char* data = NULL;
size_t size = 0;
#if COCOS2D_DEBUG >= 1
tolua_Error tolua_err;
if (!tolua_isusertype(L,1,"cc.XMLHttpRequest",0,&tolua_err)) goto tolua_lerror;
#endif
self = (LuaMinXmlHttpRequest*) tolua_tousertype(L,1,0);
#if COCOS2D_DEBUG >= 1
if (nullptr == self)
{
tolua_error(L,"invalid 'self' in function 'lua_cocos2dx_XMLHttpRequest_send'\n", nullptr);
return 0;
}
#endif
self->getHttpHeader().clear();
self->setErrorFlag(false);
argc = lua_gettop(L) - 1;
if ( 1 == argc )
{
#if COCOS2D_DEBUG >= 1
if (!tolua_isstring(L, 2, 0, &tolua_err))
goto tolua_lerror;
#endif
//data = tolua_tostring(L, 2, "");
data = (const char*) lua_tolstring(L, 2, &size);
}
if (size > 0 &&
(self->getMethod().compare("post") == 0 || self->getMethod().compare("POST") == 0
|| self->getMethod().compare("put") == 0 || self->getMethod().compare("PUT") == 0 )&&
nullptr != self->getHttpRequest())
{
self->getHttpRequest()->setRequestData(data,size);
}
self->_setHttpRequestHeader();
self->_sendRequest();
return 0;
#if COCOS2D_DEBUG >= 1
tolua_lerror:
tolua_error(L,"#ferror in function 'lua_cocos2dx_XMLHttpRequest_send'.",&tolua_err);
return 0;
#endif
}
3.自动绑定回调函数
找到 lua_cocos2d-x_manual.cpp 文件,
1.先要注册
把MenuItem替换成你要绑定的类 MyClass
1. MenuItem* cobj = nullptr;
2. if (!tolua_isusertype(tolua_S,1,”cc.MenuItem”,0,&tolua_err)) goto tolua_lerror;
3. cobj = static_cast
static int tolua_cocos2d_MenuItem_registerScriptTapHandler(lua_State* tolua_S)
{
if (NULL == tolua_S)
return 0;
int argc = 0;
MenuItem* cobj = nullptr;
#if COCOS2D_DEBUG >= 1
tolua_Error tolua_err;
if (!tolua_isusertype(tolua_S,1,"cc.MenuItem",0,&tolua_err)) goto tolua_lerror;
#endif
cobj = static_cast<cocos2d::MenuItemImage*>(tolua_tousertype(tolua_S,1,0));
#if COCOS2D_DEBUG >= 1
if (nullptr == cobj) {
tolua_error(tolua_S,"invalid 'cobj' in function 'tolua_cocos2d_MenuItem_registerScriptTapHandler'\n", NULL);
return 0;
}
#endif
argc = lua_gettop(tolua_S) - 1;
if (1 == argc)
{
#if COCOS2D_DEBUG >= 1
if (!toluafix_isfunction(tolua_S,2,"LUA_FUNCTION",0,&tolua_err)) {
goto tolua_lerror;
}
#endif
LUA_FUNCTION handler = toluafix_ref_function(tolua_S,2,0);
ScriptHandlerMgr::getInstance()->addObjectHandler((void*)cobj, handler, ScriptHandlerMgr::HandlerType::MENU_CLICKED);
return 0;
}
luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n", "cc.MenuItem:registerScriptTapHandler",argc, 1);
return 0;
#if COCOS2D_DEBUG >= 1
tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'tolua_cocos2d_MenuItem_registerScriptTapHandler'.",&tolua_err);
return 0;
#endif
}
2.回调注册的函数
LuaEngine::getInstance()->getLuaStack()->pushString(backTag.c_str());
LuaEngine::getInstance()->getLuaStack()->executeFunctionByHandler("回调对象", 参数个数);
LuaEngine::getInstance()->getLuaStack()->clean();
//移除注册函数
ScriptHandlerMgr::getInstance()->removeObjectHandler("回调对象", ScriptHandlerMgr::HandlerType::MENU_CLICKED);