用quick cocos開發游戲的時候,如果你有接入過SDK,或者做過復制到剪貼板,獲取設備信息等,肯定就會碰到Lua調用Java層的需求。
于是就需要用到:LuaJavaBridge。
在使用require "framework"過后,可以直接使用luaj(具體可以查看luaj.lua)
這篇文章主要記錄如何使用。
1. 使用
luaj和luaoc都是調用的static方法
所以,在Java層加上一個public的static方法,如:
public static void testLuaj(){
Log.i("Luaj", "testLuaj");
}
quick cocos運行的主activity是AppActivity,完整類名稱為:org/cocos2dx/lua/AppActivity
所以,在lua層可以使用如下代碼調用:
luaj.callStaticMethod("org/cocos2dx/lua/AppActivity","testLuaj",{},"()V")
2. 參數介紹
第一個參數是完整的類名稱,“.”需要使用“/”,如"org/cocos2dx/lua/AppActivity"
第二個參數是方法名,如"testLuaj"
第三個參數是參數,無參數的時候使用空table
第四個參數指定參數的類型和返回類型的簽名
3. 參數類型
簽名 解釋
()V 參數:無,返回值:無
(I)V 參數:int,返回值:無
(Ljava/lang/String;)Z 參數:字符串,返回值:布爾值
(IF)Ljava/lang/String; 參數:整數、浮點數,返回值:字符串
類型名 類型
I 整數,或者 Lua function
F 浮點數
Z 布爾值
Ljava/lang/String; 字符串
V Void 空,僅用于指定一個 Java 方法不返回任何值
4. error code
錯誤代碼 描述
-1 不支持的參數類型或返回值類型
-2 無效的簽名
-3 沒有找到指定的方法
-4 Java 方法執行時拋出了異常
-5 Java 虛擬機出錯
-6 Java 虛擬機出錯
- 附:參數類型和error code懶得自己寫,從Vincent__Lee的CSDN博客拷貝過來的。
5. 返回值
luaj有兩個返回值,一個是調用結果,一個是返回值。
如:
public static String getProvider(){
return "TapTap";
}
-- Ljava/lang/String;的;是不可省略的
local ok, result = luaj.callStaticMethod("org/cocos2dx/lua/AppActivity", "getProvider", {}, "()Ljava/lang/String;")
print("執行結果:", ok)
print("provider: ", result)
6. 特別介紹
可以將lua的方法作為int類型參數傳入Java方法
也可以把table轉換為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);
// 可以通過這種方法獲取lua傳入的值
String testId = argsJ.getInt("id")
String testVal = argsJ.getString("val");
// ok為傳入到lua回調的參數
Cocos2dxLuaJavaBridge.callLuaFunctionWithString(callback, "ok");
Cocos2dxLuaJavaBridge.releaseLuaFunction(callback);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
local function callback(result)
print("result") -- 會打印出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的時候要注意,參數必須是3個
LuaObjcBridge.callStaticMethod("AppController", "getProvider")
會導致執行失敗
LuaObjcBridge.callStaticMethod("AppController", "getProvider", nil)
luaoc.callStaticMethod就是3個參數,少傳一個是自動幫你傳了nil過去,所以不會出錯。