2012-09-10 21 views
7

Luaj + javaを使用してコントローラを構築しようとしています。私は、次のJavaクラスコントローラの公開されているluaj関数にオブジェクトを渡すにはどうすればよいですか?

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で書かれた)1つのコントローラを定義したいと思いますロジック、私はそのコントローラから私のJavaコードにAPIを公開したいと思います。

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と組み込みスクリプトを使用する場合、1つのスクリプトで人々バンドル関数を実行するか、すべてのコールバックに対して別々のスクリプトがありますか?

答えて

24

件のエントリを検索していましたが、あなたの回答が見つかりませんでした。あなたの質問は面白かったし、私に検索させた。それから、私は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);を使用して、LuaのにこれらのJavaオブジェクトを変換しようとしたが、それは動作しません:示すように、我々は確かに、ユーザデータを持っていますトレースではなくメタ可能でないので、メソッドを呼び出すことも、フィールドにアクセスすることもできません。他のライブラリはLuaのでより目指しているように見える一方で/

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

私はおそらくより多くのJavaプログラマのために作られた:-) LuajのAPIを...感謝:

は多くのことを検索した後、私は右の呪文を発見しましたCプログラマ...

+3

これはゴールドです。ありがとうございました。 – Qix

関連する問題