我正在搜索luaj条目,但未找到答案。您的问题很有趣,让我搜寻。然后我意识到这是两年前提出来的……我希望我的回答对其他人有用!基于luaj-3.0-alpha1的代码。
我们需要一个有效的Lua脚本(您忘记了
function关键字):
function onTalk(javaObj) print(type(javaObj) .. " " .. tostring(javaObj)) print(javaObj.name) javaObj:talk() return trueendfunction 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);但它不起作用:正如跟踪所示,我们确实有用户数据,但是没有metatable,因此我们既不能调用方法也不能访问字段。
经过大量搜索后,我发现了正确的咒语:
Compiledscript script = ((Compilable) scriptEngine).compile(reader);Bindings sb = new SimpleBindings();script.eval(sb); // Put the Lua functions into the sb environmentLuaValue luaDog = CoerceJavaToLua.coerce(dog); // Java to LuaLuaFunction onTalk = (LuaFunction) sb.get("onTalk"); // Get Lua functionLuaValue b = onTalk.call(luaDog); // Call the functionSystem.out.println("onTalk answered: " + b);LuaFunction onWalk = (LuaFunction) sb.get("onWalk");LuaValue[] dogs = { luaDog };Varargs dist = onWalk.invoke(LuaValue.varargsOf(dogs)); // AlternativeSystem.out.println("onWalk returned: " + dist);
我感谢Luaj API … :-)可能是为Java程序员制作的,而其他库似乎更多是为Lua / C程序员设计的…
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)