本文主要講如何完成lua和object-c的相互調用。 lua是一種腳本語言,能夠方便的移植到各類宿主語言中,而且能夠支持熱更新,在遊戲開發中也能當作主要的語言來編寫遊戲的邏輯,可是要接入第三方(例如支付寶等)時須要在不一樣的平臺上(好比Android和ios)分別接入,這是就須要oc和lua完成通訊
首先cocos2d 對oc和lua調用進行了封裝,這就更有利於咱們調用
cocos/cocos2d/luaoc
函數原型:
- -- 調用Objective-C類的接口。
- -- @function [parent=#luaoc] callStaticMethod
- -- @param string className Objective-C類名
- -- @param string methodName Objective-C類方法名
- -- @param table args Objective-C類方法所須要的各類參數字典,key值爲方法的參數名
- -- @return boolean#boolean ret (return value: bool) ok, mixed ret ok爲是否調用成功, ok爲true時,ret爲Objective-C方法的返回值,ok爲false時,ret爲出錯緣由
- function luaoc.callStaticMethod(className, methodName, args)
- 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); //最後記得釋放
}
———————————————————————結束—————————————————————————————————
就是這麼簡單