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); //最后記得釋放
}
 
 
———————————————————————結束—————————————————————————————————
就是這么簡單
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM