LuaJ教程-luaj命令行使用

本文介绍了一个Java实现的Lua脚本解释器luaJ的使用方法,包括执行Lua脚本、编译Lua脚本为Lua字节码及Java字节码的过程,并提供了具体的命令行操作示例。

luaJ是一个java实现的lua脚本解释器,适合嵌入java应用中。个人比较喜欢libgdx这个引擎,所以对luaJ项目也有一些关注。cocos2d貌似也用到了这个。对于一些不想使用本地库的java项目,luaJ是个不错的选择。我下载的是luaJ-3.0.1版本,解压后可以得到完整的工程目录。主要用到的东西是lib文件夹中的luaj-jse-3.0.1.jar这个包,(另一个是luaJ-jme-3.0.1.jar)。版本不同可能有出入,使用带有jse的包就可以了。

1、执行lua脚本

  新建一个lua文件hello.lua,写入以下内容:

print('hello')

方便起见,将hello.lua文件新建在lib文件夹中,跟luaJ-jse-3.0.1.jar在同一个目录即可,然后打开命令行,cd到这个文件夹,输入命令:

java -cp luaj-jse-3.0.1.jar lua hello.lua

即可看到输出结果:hello

上面的luaj-jse-3.0.1.jar以及hello.lua部分可以替换成其他的目录。

 

2、编译lua脚本为lua字节码

  上面的方法使用lua命令解释模式执行lua代码,这种方法比较慢;我们可以使用luac命令来编译lua代码成为lua字节码,还是以hello.lua为例,进入lib目录下,输入:

java -cp luaj-jse-3.0.1.jar luac hello.lua

执行完毕后,当前文件夹下多出了luac.out文件,这个文件就是hello.lua编译后的lua字节码。

那么如何指定输出路径呢?可以使用命令

java -cp luaj-jse-3.0.1.jar luac hello.lua -o hello.luac

加上 -o [路径]来指定输出文件的位置。上面的命令执行后会在当前文件lib下面生成hello.luac文件。

接下来执行lua字节码。以hello.luac为例,命令如下:

java -cp luaj-jse-3.0.1.jar lua hello.luac

如果没有指定输出:

java -cp luaj-jse-3.0.1.jar lua luac.out

 

3、lua脚本编译成java字节码

  这个功能很强大,不过可能用的人不多...这个命令是luajc;使用这个命令需要安装ant,以及bcel-5.2.jar这个包。后者可以百度英文搜索bcel-5.2来下载。下载完成后把bcel-5.2.jar放到lib目录下。方便起见同样切换到lib目录下执行。

命令如下:

java -cp luaj-jse-3.0.1.jar;bcel-5.2.jar luajc -s . -d . hello.lua

特别注意那两个点,代表当前目录:-s后面是源代码目录所在,-d后是输出的class文件目录所在,最后是文件名。

执行后在lib目录下生成了hello.class

接下来执行hello.class文件,同样在lib目录下执行

java -cp luaj-jse-3.0.1.jar;. lua -l hello

运行后输出hello

 

转载于:https://www.cnblogs.com/mingwuyun/p/5137812.html

Lua 中处理 Scala 代码或数据结构并不是一个常见的应用场景,因为两者是独立的编程语言,分别运行于不同的环境(Lua 通常运行于原生环境,而 Scala 运行于 JVM 上)。然而,可以通过一些方法实现跨语言交互,尤其是利用 Lua 的 C API 或者通过外部工具实现与 Scala 的通信。 ### 处理 Scala 数据结构 Scala 的数据结构(如 List、Map、Set 等)可以通过序列化为通用格式(如 JSON、XML 或 Protocol Buffers)后在 Lua 中进行解析和操作。例如,Scala 可以将数据结构序列化为 JSON 字符串: ```scala import org.json4s._ import org.json4s.jackson.JsonMethods._ implicit val formats: DefaultFormats.type = DefaultFormats val data = Map("key1" -> List(1, 2, 3), "key2" -> List(4, 5)) val jsonData: String = compact(render(decompose(data))) ``` 在 Lua 中可以使用 JSON 解析库(如 `dkjson`)来解析该字符串: ```lua local dkjson = require("dkjson") local json_data = '{"key1":[1,2,3],"key2":[4,5]}' local decoded = dkjson.decode(json_data) for k, v in pairs(decoded) do print(k) for i, val in ipairs(v) do print(" " .. val) end end ``` ### 调用 Scala 代码 如果需要在 Lua 中直接调用 Scala 编写的函数或类,可以通过以下方式实现: 1. **通过命令行调用 Scala 脚本** Lua 可以使用 `io.popen` 或 `os.execute` 来执行 Scala 脚本,并捕获其输出: ```lua local handle = io.popen("scala MyScalaScript.scala") local result = handle:read("*a") handle:close() print(result) ``` 2. **通过 HTTP 或 IPC 通信** 可以将 Scala 程序部署为一个本地服务(如使用 Akka HTTP 或 Play Framework),然后在 Lua 中通过 HTTP 请求与其交互。例如,在 Lua使用 `socket.http` 发送请求: ```lua local http = require("socket.http") local ltn12 = require("ltn12") local response_body = {} local res, code = http.request{ url = "http://localhost:8080/scala-endpoint", method = "POST", headers = { ["Content-Type"] = "application/json" }, source = ltn12.source.string('{"input":"data"}'), sink = ltn12.sink.table(response_body) } if code == 200 then print(table.concat(response_body)) else print("Error: " .. code) end ``` 3. **通过 LuaJ 实现 LuaJava 的交互** 如果使用的是 LuaJ(一个基于 JavaLua 解释器),可以在 Lua 脚本中直接调用 Java 对象。由于 Scala 是 JVM 语言,因此可以与 Java 无缝互操作。例如: ```scala class ScalaClass { def greet(): String = "Hello from Scala" } ``` 在 LuaJ 中调用: ```lua local scalaObj = luajava.newInstance("ScalaClass") print(scalaObj:greet()) ``` ### 数据格式与互操作性 为了确保 Lua 与 Scala 之间的数据结构能够正确传递,建议使用以下数据格式之一: - **JSON**:适用于大多数结构化数据,支持嵌套对象和数组。 - **MessagePack**:二进制格式,比 JSON 更紧凑、更快。 - **Protocol Buffers**:适用于需要高性能和类型安全的场景。 ### 示例:Lua 与 Scala 通过 JSON 通信 以下是一个完整的示例,展示 Lua 如何通过 JSON 与 Scala 交换数据: **Scala 端(生成 JSON)** ```scala import org.json4s._ import org.json4s.jackson.JsonMethods._ case class User(name: String, age: Int) object ScalaToJsonExample extends App { implicit val formats: DefaultFormats.type = DefaultFormats val user = User("Alice", 30) val json = compact(render(decompose(user))) println(json) } ``` **Lua 端(解析 JSON)** ```lua local dkjson = require("dkjson") -- 假设 Scala 程序输出的 JSON 通过管道传入 local handle = io.popen("scala ScalaToJsonExample") local json_output = handle:read("*a") handle:close() local user = dkjson.decode(json_output) print("Name: " .. user.name) print("Age: " .. user.age) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值