首页IT科技java -war(Java + Lua = 王炸!!)

java -war(Java + Lua = 王炸!!)

时间2025-09-18 23:07:03分类IT科技浏览7131
导读:我们写东西的时候总会遇到lua中要调用java代码,当然这个用JNI肯定是可以做到的,但是有更加方便的办法—LuaJavaBridge。...

我们写东西的时候总会遇到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/li15225271052/article/details/70148609

近期热文推荐:

1.1,000+ 道 Java面试题及答案整理(2022最新版)

2.劲爆!Java 协程要来了        。            。                          。

3.Spring Boot 2.x 教程                      ,太全了!

4.别再写满屏的爆爆爆炸类了,试试装饰器模式                    ,这才是优雅的方式!!

5.《Java开发手册(嵩山版)》最新发布                          ,速速下载!

觉得不错     ,别忘了随手点赞+转发哦!

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
富爸爸现金流游戏怎么偿还贷款(什么游戏赚现金-“富爸爸现金流”游戏的思考) linux命令行复制文件夹(10+常用Linux命令行处理文件复制和目录复制)