cocos2dx-lua 调用 原生ios 和 android

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的使用.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值