cocos2dx 版本:3.17.2
cocos提供了应用层上面的 lua 和 原生的互调, 通过LuaBridge实现.不过使用情况有限,只有几个API可供使用,简单调用还可以,再lua调用原生方法的时候是无法获取返回值,简单写了个实现,不推荐使用
先上 lua 的方法
--获取lua 调用类
XXFun.XXGetNativeRequire = function()
if (cc.PLATFORM_OS_IPHONE == targetPlatform) or (cc.PLATFORM_OS_IPAD == targetPlatform) or (cc.PLATFORM_OS_MAC == targetPlatform) then
return require "cocos.cocos2d.luaoc"
elseif(cc.PLATFORM_OS_ANDROID == targetPlatform) then
return require "cocos.cocos2d.luaj"
end
end
--原生调用lua
XXFun.RecvNativeCall = function( arg )
XXLog( "RecvNativeCall arg: " .. arg )
local model = XXMVCManager:getModel("testM3")
model.testStr = arg
model:update()
end
--调用原生函数 arg为table类型
XXFun.CallNativeFun = function( arg )
local ok,ret = 0
if (cc.PLATFORM_OS_IPHONE == targetPlatform) or (cc.PLATFORM_OS_IPAD == targetPlatform) or (cc.PLATFORM_OS_MAC == targetPlatform) then
ok,ret = XXFun.XXGetNativeRequire().callStaticMethod("XXIOS","recvLuaTableToDictionary", arg )
elseif(cc.PLATFORM_OS_ANDROID == targetPlatform) then
local className = "org/cocos2dx/lua/AppActivity"
sigs = "(Ljava/lang/String;I)V"
ok = XXFun.XXGetNativeRequire().callStaticMethod(className,"callbackLua",arg,sigs)
end
if not ok then
XXLogError("CallNativeFun() error!!" )
end
return ok,ret
end
--注册lua接收原生调用的函数
XXFun.RegisterLuaHandler = function()
if (cc.PLATFORM_OS_IPHONE == targetPlatform) or (cc.PLATFORM_OS_IPAD == targetPlatform) or (cc.PLATFORM_OS_MAC == targetPlatform) then
XXFun.CallNativeFun({scriptHandler = XXFun.RecvNativeCall })
elseif(cc.PLATFORM_OS_ANDROID == targetPlatform) then
end
end
objective-c 代码
- (void) setScriptHandler:(int)scriptHandler
{
if (_scriptHandler)
{
LuaBridge::releaseLuaFunctionById(_scriptHandler);
_scriptHandler = 0;
}
_scriptHandler = scriptHandler;
NSLog(@"OC - setScriptHandler %d",_scriptHandler);
}
- (int) getScriptHandler
{
return _scriptHandler;
}
+ (void) unregisterScriptHandler
{
[[XXIOS getInstance] setScriptHandler:0];
}
+ (void) callbackScriptHandler:(NSString*)msg
{
int scriptHandler = [[XXIOS getInstance] getScriptHandler];
if (scriptHandler)
{
LuaBridge::pushLuaFunctionById(scriptHandler);
LuaStack *stack = LuaBridge::getStack();
stack->pushString([msg UTF8String]);
stack->executeFunction(1);
}
}
+ (int)recvLuaTableToDictionary:(NSDictionary *)dict{
for (NSString *key in dict)
{
NSLog(@"recvLuaTableToDictionary key:%@",key);
NSString * value = (NSString *)[dict objectForKey:key];
if([key isEqual: @"scriptHandler"])
{
[[XXIOS getInstance] setScriptHandler:[value intValue]];
}
else if([key isEqual: @"test"])
{
[XXIOS callbackScriptHandler:(value)];
}
}
return 0;
}
实现到这里,去弄android的时候,发现只有两个方法,实在是不靠谱,想实现传值特别麻烦,就没有去写了,不过单纯是一些调用的话,还是可以胜任的
简单总结下功能:
1.lua 注册一个 function 到 native端进行缓存, 可进行 native -> lua的调用,可传参,无返回值
2.lua 调用native的一些静态方法,可传字典过去
总之,不建议使用,后续我会给出tolua的使用.