Vit*_*nko 8 java lua callback 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!"); }
}
Run Code Online (Sandbox Code Playgroud)
以及控制器的以下lua脚本:
onTalk(obj)
obj:talk();
end
onWalk(obj)
obj:walk();
end
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想定义一个控制器(用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 ???
Run Code Online (Sandbox Code Playgroud)
我无法将对象传递给LuaValue.如何将java对象传递给lua脚本?
PS:通常,在使用Java和嵌入式脚本时,人们是否将函数捆绑在一个脚本中,或者每个回调都有单独的脚本?
Phi*_*Lho 26
我正在搜索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
Run Code Online (Sandbox Code Playgroud)
我添加了一些痕迹...我也做了类似于你的类:
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..."); }
}
Run Code Online (Sandbox Code Playgroud)
添加一个字段来测试它.对于我的测试,我只是在方法中声明了创建实例的类:
Dog dog = new Dog("Rex");
Cat cat = new Cat("Felix");
Run Code Online (Sandbox Code Playgroud)
我首先尝试将这些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);
Run Code Online (Sandbox Code Playgroud)
我很欣赏Luaj API ... :-)可能更多的是为Java程序员做的,而其他库似乎更多的是针对Lua/C程序员......
| 归档时间: |
|
| 查看次数: |
4117 次 |
| 最近记录: |