2012-09-10 21 views
7

Estoy intentando construir un controlador usando Luaj + java. Tengo las siguientes clases de Java¿Cómo puedo pasar objetos a una función luaj expuesta?

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!"); } 
} 

y el siguiente script lua para el controlador:

onTalk(obj) 
    obj:talk(); 
end 

onWalk(obj) 
    obj:walk(); 
end 

que sería ideal sería definir un controlador (escrito en LUA) donde voy a mantener todo el programa de lógica, y me gustaría exponer la API de ese controlador a mi código java. Yo estaba tratando de utilizar el siguiente enfoque:

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 ??? 

no soy capaz de pasar el objeto a la LuaValue. ¿Cómo puedo pasar un objeto java a la secuencia de comandos lua?

PD: En general, cuando se utilizan scripts Java y embebidos, ¿las personas agrupan funciones en una secuencia de comandos o hay una secuencia de comandos separada para cada devolución de llamada?

Respuesta

24

Estaba buscando entradas y encontré su sin respuesta. Tu pregunta fue interesante y me hizo buscar. Entonces me di cuenta de que se lo pidieron hace dos años ... ¡Espero que mi respuesta pueda ser útil para otra persona! Código basado en luaj-3.0-alpha1.

Necesitamos un script Lua válida (se le olvidó la palabra clave 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 

he añadido un poco de rastro ... También hice clases similares a sus:

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..."); } 
} 

Agregar un campo para probar esto también. Para mi prueba, me acaba de declarar las clases dentro del método de creación de sus instancias:

Dog dog = new Dog("Rex"); 
Cat cat = new Cat("Felix"); 

primera vez que trató de convertir objetos Java para estos Lua, utilizando LuaValue luaDog = LuaValue.userdataOf(dog); pero no funciona: tenemos, de hecho los datos de usuario, como se muestra por los rastros, pero no metatabla, por lo que no podemos llamar a los métodos ni acceder a los campos.

Después de buscar mucho, descubrí el encantamiento derecha:

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); 

aprecio la API Luaj ... :-) Probablemente más hizo para los programadores de Java, mientras que otras bibliotecas parecen apuntar más en Lua/C programadores ...

+3

Holy crap this is gold. Gracias. – Qix

Cuestiones relacionadas