用quick cocos開(kāi)發(fā)游戲的時(shí)候,如果你有接入過(guò)SDK楼镐,或者做過(guò)復(fù)制到剪貼板,獲取設(shè)備信息等往枷,肯定就會(huì)碰到Lua調(diào)用Java層的需求框产。
于是就需要用到:LuaJavaBridge。
在使用require "framework"過(guò)后错洁,可以直接使用luaj(具體可以查看luaj.lua)
這篇文章主要記錄如何使用秉宿。
1. 使用
luaj和luaoc都是調(diào)用的static方法
所以,在Java層加上一個(gè)public的static方法屯碴,如:
public static void testLuaj(){
Log.i("Luaj", "testLuaj");
}
quick cocos運(yùn)行的主activity是AppActivity描睦,完整類名稱為:org/cocos2dx/lua/AppActivity
所以,在lua層可以使用如下代碼調(diào)用:
luaj.callStaticMethod("org/cocos2dx/lua/AppActivity","testLuaj",{},"()V")
2. 參數(shù)介紹
第一個(gè)參數(shù)是完整的類名稱导而,“.”需要使用“/”忱叭,如"org/cocos2dx/lua/AppActivity"
第二個(gè)參數(shù)是方法名隔崎,如"testLuaj"
第三個(gè)參數(shù)是參數(shù),無(wú)參數(shù)的時(shí)候使用空table
第四個(gè)參數(shù)指定參數(shù)的類型和返回類型的簽名
3. 參數(shù)類型
簽名 解釋
()V 參數(shù):無(wú)韵丑,返回值:無(wú)
(I)V 參數(shù):int爵卒,返回值:無(wú)
(Ljava/lang/String;)Z 參數(shù):字符串,返回值:布爾值
(IF)Ljava/lang/String; 參數(shù):整數(shù)撵彻、浮點(diǎn)數(shù)钓株,返回值:字符串
類型名 類型
I 整數(shù),或者 Lua function
F 浮點(diǎn)數(shù)
Z 布爾值
Ljava/lang/String; 字符串
V Void 空陌僵,僅用于指定一個(gè) Java 方法不返回任何值
4. error code
錯(cuò)誤代碼 描述
-1 不支持的參數(shù)類型或返回值類型
-2 無(wú)效的簽名
-3 沒(méi)有找到指定的方法
-4 Java 方法執(zhí)行時(shí)拋出了異常
-5 Java 虛擬機(jī)出錯(cuò)
-6 Java 虛擬機(jī)出錯(cuò)
- 附:參數(shù)類型和error code懶得自己寫(xiě)轴合,從Vincent__Lee的CSDN博客拷貝過(guò)來(lái)的。
5. 返回值
luaj有兩個(gè)返回值碗短,一個(gè)是調(diào)用結(jié)果受葛,一個(gè)是返回值。
如:
public static String getProvider(){
return "TapTap";
}
-- Ljava/lang/String;的;是不可省略的
local ok, result = luaj.callStaticMethod("org/cocos2dx/lua/AppActivity", "getProvider", {}, "()Ljava/lang/String;")
print("執(zhí)行結(jié)果:", ok)
print("provider: ", result)
6. 特別介紹
可以將lua的方法作為int類型參數(shù)傳入Java方法
也可以把table轉(zhuǎn)換為json傳入
public static void testLuaCallback(final int callback, final String args){
AppActivity.activity.runOnUiThread(new Runnable() {
@Override
public void run() {
try {
JSONObject argsJ = new JSONObject(args);
// 可以通過(guò)這種方法獲取lua傳入的值
String testId = argsJ.getInt("id")
String testVal = argsJ.getString("val");
// ok為傳入到lua回調(diào)的參數(shù)
Cocos2dxLuaJavaBridge.callLuaFunctionWithString(callback, "ok");
Cocos2dxLuaJavaBridge.releaseLuaFunction(callback);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
local function callback(result)
print("result") -- 會(huì)打印出ok
end
local args = json.encode({ id = 1, val = "test" })
luaj.callStaticMethod("org/cocos2dx/lua/AppActivity", "testLuaCallback", {callback, args}, "(ILjava/lang/String;)V")
7. 注意
直接使用LuaObjcBridge的時(shí)候要注意豪椿,參數(shù)必須是3個(gè)
LuaObjcBridge.callStaticMethod("AppController", "getProvider")
會(huì)導(dǎo)致執(zhí)行失敗
LuaObjcBridge.callStaticMethod("AppController", "getProvider", nil)
luaoc.callStaticMethod就是3個(gè)參數(shù)奔坟,少傳一個(gè)是自動(dòng)幫你傳了nil過(guò)去,所以不會(huì)出錯(cuò)搭盾。