之前写了cocos2dx-luaj与android交互 ,接下来记录下在cocos2dx开发过程中lua与oc的交互。
cocos2dx中lua调用oc 同样cocos也为我们提供了cocos.cocos2d.luaoc
类,也仅包含一个方法:callStaticMethod
,与luaj相比只少了一个sig参数,源码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 local luaoc = {}local callStaticMethod = LuaObjcBridge.callStaticMethodfunction luaoc.callStaticMethod (className, methodName, args) local ok, ret = callStaticMethod(className, methodName, args) if not ok then local msg = string .format ("luaoc.callStaticMethod(\"%s\", \"%s\", \"%s\") - error: [%s] " , className, methodName, tostring (args), tostring (ret)) if ret == -1 then print (msg .. "INVALID PARAMETERS" ) elseif ret == -2 then print (msg .. "CLASS NOT FOUND" ) elseif ret == -3 then print (msg .. "METHOD NOT FOUND" ) elseif ret == -4 then print (msg .. "EXCEPTION OCCURRED" ) elseif ret == -5 then print (msg .. "INVALID METHOD SIGNATURE" ) else print (msg .. "UNKNOWN" ) end end return ok, ret end return luaoc
同样的也是在OC层提供了一个LuaObjcBridge
的类,注册了一个callStaticMethod
的方法。
1 2 3 4 5 6 7 8 9 10 11 void LuaObjcBridge::luaopen_luaoc(lua_State *L){ s_luaState = L; lua_newtable(L); lua_pushstring(L, "callStaticMethod" ); lua_pushcfunction(L, LuaObjcBridge::callObjcStaticMethod); lua_rawset(L, -3 ); lua_setglobal(L, "LuaObjcBridge" ); }
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 + (void ) CreateCamera{ NSLog (@"到iOS 平台了" ); } + (void ) DoTakePic: (NSDictionary *)dict{ int luaFunc = (int )[[dict objectForKey:@"lua_func" ] intValue]; luaCallbackFunc = luaFunc; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 local OC_CLASSNAME = "CameraManager" function CameraUtil:CreateCamera () if device.platform == "ios" then local luaoc = require ("cocos.cocos2d.luaoc" ) luaoc.callStaticMethod(OC_CLASSNAME, "CreateCamera" , nil ) end end function CameraUtil:TakeCameraPic (saveImgCallBack) if device.platform == "ios" then local luaoc = require ("cocos.cocos2d.luaoc" ) local param = {lua_func = saveImgCallBack} luaoc.callStaticMethod(OC_CLASSNAME, "DoTakePic" , param) end end
上面两个例子就描述了lua调用oc过程中传参与不传参的情况,但是oc端拿到lua的委托方法要如何进行调用呢?继续往下看:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #import "cocos2d.h" #import "CCLuaEngine.h" #import "CCLuaBridge.h" // 执行lua方法 - (void) execLuaFunc{ //回调函数入栈,luaCallbackFunc就是lua传过来的委托的ID LuaBridge::pushLuaFunctionById(luaCallbackFunc); LuaStack *stack = LuaBridge::getStack(); // 参数入栈 stack->pushString("success"); //执行函数,参数个数为1 stack->executeFunction(1); // release LuaBridge::releaseLuaFunctionById(luaCallbackFunc); }
好啦.