LuaJavaBridge——"讓Lua和Java互*"

用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 虛擬機出錯

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過去,所以不會出錯。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容