我在寻找luaj条目并发现您未得到答复。你的问题很有趣,让我开始搜索。然后我意识到这是两年前问的……我希望我的回答对其他人有用!代码基于luaj-3.0-alpha1。
我们需要一个有效的 Lua 脚本(你忘记了function
关键词):
function onTalk(javaObj)
print(type(javaObj) .. " " .. tostring(javaObj))
print(javaObj.name)
javaObj:talk()
return true
end
function onWalk(javaObj)
javaObj:walk()
return 1, "km"
end
我添加了一点痕迹...
我也制作了与你类似的课程:
class Dog
{
public String name;
Dog(String n) { name = n; }
public void talk() { System.out.println("Dog " + name + " barks!"); }
public void walk() { System.out.println("Dog " + name + " walks..."); }
}
class Cat
{
String name;
Cat(String n) { name = n; }
public void talk() { System.out.println("Cat " + name + " meows!"); }
public void walk() { System.out.println("Cat " + name + " walks..."); }
}
也添加一个字段来测试这一点。对于我的测试,我只是在创建其实例的方法中声明了这些类:
Dog dog = new Dog("Rex");
Cat cat = new Cat("Felix");
我首先尝试将这些 Java 对象转换为 Lua,使用LuaValue luaDog = LuaValue.userdataOf(dog);
但它不起作用:我们确实有用户数据,如跟踪所示,但没有元表,因此我们无法调用方法或访问字段。
经过一番搜索,我找到了正确的咒语:
CompiledScript script = ((Compilable) scriptEngine).compile(reader);
Bindings sb = new SimpleBindings();
script.eval(sb); // Put the Lua functions into the sb environment
LuaValue luaDog = CoerceJavaToLua.coerce(dog); // Java to Lua
LuaFunction onTalk = (LuaFunction) sb.get("onTalk"); // Get Lua function
LuaValue b = onTalk.call(luaDog); // Call the function
System.out.println("onTalk answered: " + b);
LuaFunction onWalk = (LuaFunction) sb.get("onWalk");
LuaValue[] dogs = { luaDog };
Varargs dist = onWalk.invoke(LuaValue.varargsOf(dogs)); // Alternative
System.out.println("onWalk returned: " + dist);
我很欣赏 Luaj API...:-) 可能更适合 Java 程序员,而其他库似乎更针对 Lua / C 程序员...