Object-C 和 lua的相互调用

本文主要讲如何完成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 );  // 最后记得释放
}


———————————————————————结束—————————————————————————————————
就是这么简单

猜你喜欢

转载自blog.csdn.net/xuefujin/article/details/80182311
今日推荐