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); //最後記得釋放
}
 
 
———————————————————————結束—————————————————————————————————
就是這麼簡單
相關文章
相關標籤/搜索