Skip to content

Java 类交互

javascript
const core = require('cheese-js');
lua
local core = require('cheese-lua')

静态方法 / 静态变量

javascript
// @ts-ignore
importClass(java.lang.System);
// @ts-ignore
importClass(java.lang.Integer);

console.log("currentTimeMillis =", System.currentTimeMillis()); // 静态方法
console.log("Integer.MAX_VALUE =", Integer.MAX_VALUE); // 静态变量
System.out.println("hello from Java System.out"); // 静态变量 + 实例方法
lua
local System = java.import('java.lang.System')
local Integer = java.import('java.lang.Integer')

print("currentTimeMillis =", System:currentTimeMillis()) -- 静态方法
print("Integer.MAX_VALUE =", Integer.MAX_VALUE) -- 静态变量
System.out:println("hello from Java System.out") -- 静态变量 + 实例方法

实例方法 / 实例变量

javascript
// @ts-ignore
importClass(java.lang.StringBuilder);
// @ts-ignore
importClass(android.graphics.Point);

const sb = new StringBuilder("A");
sb.append("-B").append("-C");
console.log("StringBuilder =", sb.toString()); // 实例方法

const p = new Point(10, 20);
console.log("before:", p.x, p.y); // 实例变量读取
p.x = 99; // 实例变量写入
console.log("after:", p.x, p.y);
lua
local StringBuilder = java.import('java.lang.StringBuilder')
local Point = java.import('android.graphics.Point')

local sb = StringBuilder("A")
sb:append("-B")
sb:append("-C")
print("StringBuilder =", sb:toString()) -- 实例方法

local p = Point(10, 20)
print("before:", p.x, p.y) -- 实例变量读取
p.x = 99 -- 实例变量写入
print("after:", p.x, p.y)

Java 多线程(Runnable 示例)

下面示例演示:创建 Runnable 并交给 Thread 执行。

javascript
// @ts-ignore
importClass(java.lang.Thread);
// @ts-ignore
importClass(java.lang.Runnable);
// @ts-ignore
importClass(java.lang.System);

const task = new Runnable({
  run: function () {
    try {
      System.out.println("worker start");
      Thread.sleep(300);
      System.out.println("worker end");
    } catch (e) {
      console.error(e);
    }
  }
});

const t = new Thread(task);
t.start();
t.join();
lua
local Thread = java.import('java.lang.Thread')
local Runnable = java.import('java.lang.Runnable')
local System = java.import('java.lang.System')

local task = java.proxy(Runnable, {
    run = function()
        System.out:println("worker start")
        Thread:sleep(300)
        System.out:println("worker end")
    end
})

local t = Thread(task)
t:start()
t:join()

注意事项

  • 不是所有 Java 类都有可直接读写的公有实例变量;很多类只开放 getter/setter。
  • JS 与 Lua 的桥接层会自动做一部分类型转换,但复杂对象建议先打印类型再操作。

Released under the GPL-3.0 License.