如何将对象传递给公开的luaj函数?

我正在尝试使用Luaj + java构建一个控制器。 我有以下java类

public class Duck { public void talk() { System.out.println("Duck quacks!"); } public void walk() { System.out.println("Duck walks!"); } } public class Person { public void talk() { System.out.println("Person talks!"); } public void walk() { System.out.println("Person walks!"); } } 

以及控制器的以下lua脚本:

 onTalk(obj) obj:talk(); end onWalk(obj) obj:walk(); end 

理想情况下,我想定义一个控制器(用lua编写),我将保留所有程序的逻辑,并且我希望将该控制器的API公开给我的java代码。 我试图使用以下方法:

 ScriptEngineManager sem = new ScriptEngineManager(); ScriptEngine engine = sem.getEngineByExtension(".lua"); ScriptEngineFactory factory = engine.getFactory(); // Script defined above CompiledScript cs = ((Compilable)engine).compile(MY_LUA_SCRIPT); SimpleBindings b = new SimpleBindings(); b = newSimpletBindings(); LuaValue onWalkHandler = (LuaValue)b.get("onWalk"); //func.call(LuaValue.valueOf(duck)); // Passing duck object does not work ??? 

我无法将对象传递给LuaValue。 如何将java对象传递给lua脚本?

PS:通常,在使用Java和嵌入式脚本时,人们是否将函数捆绑在一个脚本中,或者每个回调都有单独的脚本?

我正在搜索luaj条目,发现你没有回复 。 你的问题很有趣,让我搜索。 然后我才意识到2年前被问过…我希望我的回答对其他人有用! 代码基于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"); 

我首先尝试使用LuaValue luaDog = LuaValue.userdataOf(dog);将这些Java对象转换为Lua LuaValue luaDog = LuaValue.userdataOf(dog); 但它不起作用:我们确实有userdata,如跟踪所示,但没有metatable,所以我们不能调用方法也不能访问字段。

经过大量搜索,我发现了正确的咒语:

 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程序员……