LuaJavaBridge——"讓Lua和Java互*"

用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ò)搭盾。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末咳秉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鸯隅,更是在濱河造成了極大的恐慌澜建,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝌以,死亡現(xiàn)場(chǎng)離奇詭異炕舵,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)跟畅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)咽筋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人徊件,你說(shuō)我怎么就攤上這事奸攻。” “怎么了虱痕?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵睹耐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我部翘,道長(zhǎng)硝训,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮窖梁,結(jié)果婚禮上赘风,老公的妹妹穿的比我還像新娘。我一直安慰自己窄绒,他們只是感情好贝次,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著彰导,像睡著了一般蛔翅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上位谋,一...
    開(kāi)封第一講書(shū)人閱讀 49,842評(píng)論 1 290
  • 那天山析,我揣著相機(jī)與錄音,去河邊找鬼掏父。 笑死笋轨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赊淑。 我是一名探鬼主播爵政,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼陶缺!你這毒婦竟也來(lái)了钾挟?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤饱岸,失蹤者是張志新(化名)和其女友劉穎掺出,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體苫费,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡汤锨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了百框。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闲礼。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖铐维,靈堂內(nèi)的尸體忽然破棺而出柬泽,到底是詐尸還是另有隱情,我是刑警寧澤方椎,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布聂抢,位于F島的核電站钧嘶,受9級(jí)特大地震影響棠众,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一闸拿、第九天 我趴在偏房一處隱蔽的房頂上張望空盼。 院中可真熱鬧,春花似錦新荤、人聲如沸揽趾。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)篱瞎。三九已至,卻和暖如春痒芝,著一層夾襖步出監(jiān)牢的瞬間俐筋,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工严衬, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留澄者,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓请琳,卻偏偏與公主長(zhǎng)得像粱挡,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子俄精,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容