lua绑定

来源:互联网 发布:unix环境高级编程 mobi 编辑:程序博客网 时间:2024/04/28 15:50

1.通过 genbindings.py 绑定

coco2d-x3.10

1.根据 README 选择对应的 NDK

android-ndk-r10c

2.出错找不到libclang

  1. ./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.查看参数个数

  1. lua 通过 send 方法调用 xhr:send() 或 xhr:send(“参数”) lua文件
  2. 执行 lua_cocos2dx_XMLHttpRequest_send 自动生成cpp文件
  3. if ( 1 == argc ) 判断如果有一个参数,没有参数执行下面的 自动生成cpp文件
  4. 通过 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 >= 1tolua_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 >= 1tolua_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);
0 0
原创粉丝点击