共计 3202 个字符,预计需要花费 9 分钟才能阅读完成。
咱们写货色的时候总会遇到 lua 中要调用 java 代码,当然这个用 JNI 必定是能够做到的,然而有更加不便的方法—LuaJavaBridge。
一、luaj 次要特色
* 能够从 Lua 调用 Java Class Static Method
* 调用 Java 办法时,反对 int/float/boolean/String/Lua function 五种参数类型
* 能够将 Lua function 作为参数传递给 Java,并让 Java 保留 Lua function 的援用
* 能够从 Java 调用 Lua 的全局函数,或者调用援用指向的 Lua function
luaj 的性能很简略,但对于集成各种 SDK 来说曾经齐全满足需要了。
二、luaj 用法示例
Java 办法原型
public static float getNum(float n) {return n;}
local className = "com/qeeplay/frameworks/CheShi"
local method = 'getDisplayWidth'
local n = 10
local args = {n}
local _, screenwidth = luaj.callStaticMethod(className, method, args)
三、luaj 实现原理
luaj 的外围指标有两个:从 Lua 调用 Java, 从 Java 调用 Lua。
整理出来就是如下几点
* 查找并调用指定的 Java 办法
* 查看调用后果,并从 Java 办法获取返回值
* 将 Lua function 作为参数传递给 Java 办法
* 在 Java 办法中调用 Lua function
举荐一个开源收费的 Spring Boot 最全教程:
https://github.com/javastacks/spring-boot-best-practice
四、查找并调用指定的 Java 办法
JNI 提供了 FindClass() 办法用于查找指定的 Class,所以 luaj.callStaticMethod() 的第一个参数就是要调用的 Java Class 的残缺类名称(类名称中的“.”要替换为“/”)。
找到指定 Class 后,利用 JNI 的 GetStaticMethodID() 办法就能够找到这个类的指定静态方法,前提是要提供静态方法的名称和签名。
所谓签名,就是指 Java 办法的参数类型和返回类型定义。例如后面示例代码中 GameInterface_doBilling() 办法的签名是 (Ljava/lang/String;ZZI)V。对于 Java 办法签名的具体定义,能够参考:JNI Type Signatures。
这里要说的是 luaj 能够依据调用参数主动猜想办法签名所以示例中咱们并没有写签名,示例中指定参数
local args = {n}1
luaj 依据这 个参数,会结构出正确的办法签名。
留神,这里要说的是 Lua 里没有方法精确判断一个数值是整数还是浮点数,所以 luaj 在猜想办法签名时,假设所有的数值都是浮点数。所以上面调用会报错
public static int getNum(int n) {return n;}
local className = "com/qeeplay/frameworks/CheShi"
local method = 'getDisplayWidth'
local n = 10
local args = {n}
local _, screenwidth = luaj.callStaticMethod(className, method, args)
这样是不行的,所以这个时候咱们要本人定义签名,上面给出正确的示例
public static int getNum(int n) {return n;}
local className = "com/qeeplay/frameworks/CheShi"
local method = 'getDisplayWidth'
local n = 10
local args = {n}
local sig = "(I)I"
local _, screenwidth = luaj.callStaticMethod(className, method, args,sig)
签名应用“(顺次排列的参数类型) 返回值类型”的格局,几个例子如下:
签名 解释
()V 参数:无,返回值:无
(I)V 参数:int,返回值:无
(Ljava/lang/String;)Z 参数:字符串,返回值:布尔值
(IF)Ljava/lang/String; 参数:整数、浮点数,返回值:字符串 12345
这里列出不同类型对应的 Java 签名字符串:
类型名 类型
I 整数,或者 Lua function
F 浮点数
Z 布尔值
Ljava/lang/String; 字符串
V Void 空,仅用于指定一个 Java 办法不返回任何值 123456
Java 办法里接管 Lua function 的参数必须定义为 int 类型
五、查看调用后果,并从 Java 办法获取返回值
uaj 调用 Java 办法时,可能会呈现各种谬误,因而 luaj 提供了一种机制让 Lua 调用代码能够确定 Java 办法是否胜利调用。
luaj.callStaticMethod() 会返回两个值:
* 当胜利时,第一个值为 true,第二个值是 Java 办法的返回值(如果有)。* 当失败时,第一个值为 false,第二个值是错误代码。
上面的代码展现了如何查看返回后果和取得返回值:
java 代码
public static int AddTwoNumbers(final int number1, final int number2) {return number1 + number2;}
Lua 代码
local args = {2, 3}
local sig = "(II)I"
local ok, ret = luaj.callStaticMethod(className, "AddTwoNumbers", args, sig)
if not ok then
print("luaj error:", ret)
else
print("ret:", ret)
end
错误代码定义如下:
错误代码 形容
-1 不反对的参数类型或返回值类型
-2 有效的签名
-3 没有找到指定的办法
-4 Java 办法执行时抛出了异样
-5 Java 虚拟机出错
-6 Java 虚拟机出错
六、将 Lua function 作为参数传递给 Java 办法
Lua 虚拟机中,Lua function 以值的模式保留。但这个值无奈间接给 Java 用,所以 luaj 做了一个 Lua function 援用表。当一个 Lua function 传递给 Java 时,这个 function 对应的值会被存在援用表中,并取得一个惟一的援用 ID(整数)。Java 代码拿到这个援用 ID 后,就能够很不便的调用该 Lua function 了。
所以 Java 办法里接管 Lua function 的参数必须定义为 int 类型,示例:
public static int getNum(int n) {return n;}
local function callback(result)
end
local className = "com/qeeplay/frameworks/CheShi"
local method = 'getDisplayWidth'
local args = {callback}
local sig = "(I)I"
local _, screenwidth = luaj.callStaticMethod(className, method, args,sig)
版权申明:本文为 CSDN 博主「Vincent__Lee」的原创文章,遵循 CC 4.0 BY-SA 版权协定,转载请附上原文出处链接及本申明。原文链接:https://blog.csdn.net/li15225…
近期热文举荐:
1.1,000+ 道 Java 面试题及答案整顿 (2022 最新版)
2. 劲爆!Java 协程要来了。。。
3.Spring Boot 2.x 教程,太全了!
4. 别再写满屏的爆爆爆炸类了,试试装璜器模式,这才是优雅的形式!!
5.《Java 开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞 + 转发哦!