震驚,Java+ lua = 王炸
可以從 Lua 調用 Java Class Static Method
調用 Java 方法時,支持 int/float/boolean/String/Lua function 五種參數(shù)類型
可以將 Lua function 作為參數(shù)傳遞給 Java,并讓 Java 保存 Lua function 的引用
可以從 Java 調用 Lua 的全局函數(shù),或者調用引用指向的 Lua function
luaj 的功能很簡單,但對于集成各種 SDK 來說已經(jīng)完全滿足需求了。
luaj 用法示例
Java 方法原型:
public static float getNum(float n) {return n;}
-- Java 類的名稱local className = "com/xttblog/Test"-- 調用 的Java 方法名local method = 'getNum'-- 調用 Java 方法需要的參數(shù)local n = 10local args = {n}-- 調用 Java 方法local _, testStaticMethod = luaj.callStaticMethod(className, method, args)
luaj 實現(xiàn)原理
查找并調用指定的 Java 方法 檢查調用結果,并從 Java 方法獲取返回值 將 Lua function 作為參數(shù)傳遞給 Java 方法 在 Java 方法中調用 Lua function
JNI 提供了 FindClass() 方法用于查找指定的 Class,所以 luaj.callStaticMethod() 的第一個參數(shù)就是要調用的 Java Class 的完整類名稱(類名稱中的“.”要替換為“/”)。
找到指定 Class 后,利用 JNI 的 GetStaticMethodID() 方法就可以找到這個類的指定靜態(tài)方法,前提是要提供靜態(tài)方法的名稱和簽名。
所謂簽名,就是指Java方法的參數(shù)類型和返回類型定義。方法的簽名就是類似(Ljava/lang/String;ZZI)V這樣的一串描述,通過字節(jié)碼方式可以查看,如下示例:

local args = {n}public static int getNum(int n) {return n;}-- Java 類的名稱local className = "com/xttblog/Test"-- 調用 的Java 方法名local method = 'getNum'-- 調用 Java 方法需要的參數(shù)local n = 10local args = {n}-- 調用 Java 方法local _, testStaticMethod = luaj.callStaticMethod(className, method, args)
public static int getNum(int n) {return n;}-- Java 類的名稱local className = "com/xttblog/Test"-- 調用 的Java 方法名local method = 'getNum'-- 調用 Java 方法需要的參數(shù)local n = 10local args = {n}-- 定義簽名-- 參數(shù): [I]nteger-- 返回值: [I]ntlocal sig = "(I)I"-- 調用 Java 方法local _, testStaticMethod = luaj.callStaticMethod(className, method, args,sig)
簽名 解釋()V 參數(shù):無,返回值:無(I)V 參數(shù):int,返回值:無(Ljava/lang/String;)Z 參數(shù):字符串,返回值:布爾值(IF)Ljava/lang/String; 參數(shù):整數(shù)、浮點數(shù),返回值:字符串
類型I 整數(shù),或者 Lua functionF 浮點數(shù)Z 布爾值字符串V Void 空,僅用于指定一個 Java 方法不返回任何值
從 Java 方法獲取返回值
當成功時,第一個值為 true,第二個值是 Java 方法的返回值(如果有)。 當失敗時,第一個值為 false,第二個值是錯誤代碼。
public static int AddTwoNumbers(final int number1, final int number2) {return number1 + number2;}
local args = {2, 3}local sig = "(II)I"local ok, ret = luaj.callStaticMethod(className, "AddTwoNumbers", args, sig)if not ok thenprint("luaj error:", ret)elseprint("ret:", ret) -- 輸出 ret: 5end
錯誤代碼 描述-1 不支持的參數(shù)類型或返回值類型-2 無效的簽名-3 沒有找到指定的方法-4 Java 方法執(zhí)行時拋出了異常-5 Java 虛擬機出錯-6 Java 虛擬機出錯
public static int getNum(int n) {return n;}local function callback(result)---方法內容end-- Java 類的名稱local className = "com/xttblog/Test"-- 調用 的Java 方法名local method = 'getNum'-- 調用 Java 方法需要的參數(shù)local args = {callback}-- 定義簽名-- 參數(shù): [I]nteger-- 返回值: [I]ntlocal sig = "(I)I"-- 調用 Java 方法local _, testStaticMethod = luaj.callStaticMethod(className, method, args,sig)

String luaStr = "print 'hello,world!'";Globals globals = JsePlatform.standardGlobals();LuaValue chunk = globals.load(luaStr);chunk.call();
--無參函數(shù)function hello()print 'hello'end--帶參函數(shù)function test(str)print('data from java is:'..str)return 'haha'end
String luaPath = "res/lua/login.lua"; //lua腳本文件所在路徑Globals globals = JsePlatform.standardGlobals();//加載腳本文件login.lua,并編譯globals.loadfile(luaPath).call();//獲取無參函數(shù)helloLuaValue func = globals.get(LuaValue.valueOf("hello"));//執(zhí)行hello方法func.call();//獲取帶參函數(shù)testLuaValue func1 = globals.get(LuaValue.valueOf("test"));//執(zhí)行test方法,傳入String類型的參數(shù)參數(shù)String data = func1.call(LuaValue.valueOf("I'am from Java!")).toString();//打印lua函數(shù)回傳的數(shù)據(jù)Logger.info("data return from lua is:"+data);
hellodata from java is:I'am from Java!八月 07, 2022 5:31:25 下午 com.tw.login.tools.Logger info信息: lua return data:hah
評論
圖片
表情
