本文主要講如何完成lua和object-c的相互調(diào)用峻堰。 ? ? ??
lua是一種腳本語言,可以方便的移植到各種宿主語言中寇僧,并且可以支持熱更新茎活,在游戲開發(fā)中也能當做主要的語言來編寫游戲的邏輯,但是要接入第三方(例如支付寶等)時需要在不同的平臺上(比如Android和ios)分別接入辖众,這是就需要oc和lua完成通信卓起。
首先cocos2d 對oc和lua調(diào)用進行了封裝,這就更有利于我們調(diào)用cocos/cocos2d/luaoc
函數(shù)原型:
--?調(diào)用Objective-C類的接口凹炸。??
--?@function?[parent=#luaoc]?callStaticMethod??
--?@param?string?className?Objective-C類名??
--?@param?string?methodName?Objective-C類方法名??
--?@param?table?args?Objective-C類方法所需要的各種參數(shù)字典,key值為方法的參數(shù)名??
--?@return?boolean#boolean?ret?(return?value:?bool)??ok,?mixed?ret?ok為是否調(diào)用成功,?ok為true時,ret為Objective-C方法的返回值,ok為false時,ret為出錯原因???
function?luaoc.callStaticMethod(className,?methodName,?args)????
end ?
———————————————————————開始—————————————————————————————————
lua調(diào)用oc
.lua代碼:
m.applePay = function (userid, price)
? ? ? ? local luaoc = require("cocos.cocos2d.luaoc")
? ? ? ? local className = “ApplePayMoney” ? ? ?—要調(diào)用的oc中的類名
? ? ? ? local methodName = “payMoney” ? ?—要調(diào)用的oc中的類中的指定方法名 ? ?要注意的是:OC里被調(diào)用方法必須是類方法戏阅,也就是前面是“+”號的方法!
? ? ? ? local args = {callBack = m.ocCallBack,userid = “1234",price = “500"} ? —要傳遞給OC的參數(shù)(以表的形式傳輸啤它,OC層以字典的形式接收) ?注意callBack參數(shù)?
? ? ? ? local ok = luaoc.callStaticMethod(className, methodName, args) ?—調(diào)用的返回值
end
--oc的回調(diào)方法
m.ocCallBack = function(str)
? ? ? ?-- body
? ? ? ? ? print(“oc回調(diào)lua成功”..str);?—str即oc回傳給lua的參數(shù)
? ? ? ?end
end
object-C代碼
1.創(chuàng)建一個類ApplePayMoney(lua中已經(jīng)指定)繼承自NSObject ? ?將.m文件的后綴名改為.mm ?( 可以實現(xiàn)oc與c的混編 )
2.在.mm文件中引入頭文件【必須】
import "CCLuaBridge.h"
import "CCLuaEngine.h"
報錯:Undefined symbols for architecture x86_64:? ?"CreateRSADataSigner(NSString*)時 因為在在該文件中調(diào)用了調(diào)用了DataSigner.m里面的一個方法
解決:把DataSigner.m也改成DataSigner.mm后綴
3.在ApplePayMoney創(chuàng)建一個類方法(+方法)?
//蘋果內(nèi)支付(供lua端調(diào)用)
+ (void)payMoney:(NSDictionary *)dict{
? ??NSLog(@"lua call ocFounction succeed");
??? NSString *userid = [dict valueForKey:@"userid"];
??? NSString *price = [dict valueForKey:@"price"];
? ? ?//這里獲取lua層的數(shù)據(jù)后 ?對數(shù)據(jù)進行操作(例如調(diào)用支付寶接口等) 將返回的數(shù)據(jù)再通過下面的方法回傳給lua層
??? int handlerID = (int)[[dict objectForKey:@"callBack"] integerValue]; ?// lua傳輸過來的回調(diào)lua的方法名 ?取inergerValue ? ?這里可以將該id緩存在oc層的一個全局變量中 ?在合適的位置再回調(diào)lua層
? ? LuaBridge::pushLuaFunctionById(handlerID); //壓入需要調(diào)用的方法id
??? LuaStack *stack = LuaBridge::getStack();? //獲取lua棧
??? stack->pushString(“oc傳遞給lua的參數(shù)");? //將需要傳遞給lua層的參數(shù)通過棧傳遞
??? stack->executeFunction(1);? //共有1個參數(shù) (“oc傳遞給lua的參數(shù)”)奕筐,這里傳參數(shù) 1
??? LuaBridge::releaseLuaFunctionById([ApplePayMoney sharedApplePayMoney].handleID); //最后記得釋放
}