• Lua 与 OC 相互调用


    本文主要讲如何完成lua和object-c的相互调用。       lua是一种脚本语言,可以方便的移植到各种宿主语言中,并且可以支持热更新,在游戏开发中也能当做主要的语言来编写游戏的逻辑,但是要接入第三方(例如支付宝等)时需要在不同的平台上(比如Android和ios)分别接入,这是就需要oc和lua完成通信
     
    首先cocos2d 对oc和lua调用进行了封装,这就更有利于我们调用
    cocos/cocos2d/luaoc
     
    函数原型:
    1. -- 调用Objective-C类的接口。  
    2. -- @function [parent=#luaoc] callStaticMethod  
    3. -- @param string className Objective-C类名  
    4. -- @param string methodName Objective-C类方法名  
    5. -- @param table args Objective-C类方法所需要的各种参数字典,key值为方法的参数名  
    6. -- @return boolean#boolean ret (return value: bool)  ok, mixed ret ok为是否调用成功, ok为true时,ret为Objective-C方法的返回值,ok为false时,ret为出错原因   
    7. function luaoc.callStaticMethod(className, methodName, args)    
    8. end  
     
    ———————————————————————开始—————————————————————————————————
     
     
    lua调用oc
    .lua代码:
     
    m.applePay = function (userid, price)
            local luaoc = require("cocos.cocos2d.luaoc")
            local className = “ApplePayMoney”      —要调用的oc中的类名
            local methodName = “payMoney”    —要调用的oc中的类中的指定方法名    要注意的是:OC里被调用方法必须是类方法,也就是前面是“+”号的方法!
            local args = {callBack = m.ocCallBack,userid = “1234",price = “500"}   —要传递给OC的参数(以表的形式传输,OC层以字典的形式接收)  注意callBack参数 
            local ok = luaoc.callStaticMethod(className, methodName, args)  —调用的返回值
    end
     
    --oc的回调方法
    m.ocCallBack = function(str)
           -- body
              print(“oc回调lua成功”..str); —str即oc回传给lua的参数
           end
    end
    object-C代码
     
    1.创建一个类ApplePayMoney(lua中已经指定)继承自NSObject    将.m文件的后缀名改为.mm  ( 可以实现oc与c的混编 )
    2.在.mm文件中引入头文件:
    #import "CCLuaBridge.h"
    #import "CCLuaEngine.h"
     
    报错:Undefined symbols for architecture x86_64:   "CreateRSADataSigner(NSString*)时 因为在在该文件中调用了调用了DataSigner.m里面的一个方法
    解决:把DataSigner.m也改成DataSigner.mm后缀
     
    3.在ApplePayMoney创建一个类方法(+方法) 
    //苹果内支付(供lua端调用)
    + (void)payMoney:(NSDictionary *)dict{
        NSLog(@"lua call ocFounction succeed");
        NSString *userid = [dict valueForKey:@"userid"];
        NSString *price = [dict valueForKey:@"price"];
         //这里获取lua层的数据后  对数据进行操作(例如调用支付宝接口等) 将返回的数据再通过下面的方法回传给lua层
     
        int handlerID = (int)[[dict objectForKey:@"callBack"] integerValue];  // lua传输过来的回调lua的方法名  取inergerValue    这里可以将该id缓存在oc层的一个全局变量中  在合适的位置再回调lua层
        LuaBridge::pushLuaFunctionById(handlerID); //压入需要调用的方法id
        LuaStack *stack = LuaBridge::getStack();  //获取lua栈
        stack->pushString(“oc传递给lua的参数");  //将需要传递给lua层的参数通过栈传递
        stack->executeFunction(1);  //共有1个参数 (“oc传递给lua的参数”),这里传参数 1
        LuaBridge::releaseLuaFunctionById([ApplePayMoney sharedApplePayMoney].handleID); //最后记得释放
    }
     
     
    ———————————————————————结束—————————————————————————————————
    就是这么简单
     
     
     
     
     
  • 相关阅读:
    拓端tecdat|Python实现谱聚类Spectral Clustering算法和改变簇数结果可视化比较
    深入浅出eBPF|你要了解的7个核心问题
    异步任务处理系统,如何解决业务长耗时、高并发难题?
    什么是真正的敏捷开发?敏捷开发与瀑布开发有何不同
    Java 应用压测性能问题定位经验分享
    EasyNLP带你玩转CLIP图文检索
    现代斗山X瓴羊:“一横四纵“解决方案聚焦中台场景级部署
    DataFunTalk:阿里建设一站式实时数仓的经验分享
    阿里可观测性数据引擎的技术实践
    全面升级!揭秘阿里云智能Logo设计的AI黑科技
  • 原文地址:https://www.cnblogs.com/luorende/p/6372718.html
Copyright © 2020-2023  润新知