1

私は小さなプロジェクトに取り組んでおり、ユーザーが独自のコンテンツを作成できるように lua スクリプトを含めることを望んでいました。ほとんど動作するようになりました。スクリプトを読み込んで実行したり、Java 内から特定の Lua メソッドを実行したりできます。しかし、lua スクリプトで実行できるメソッドを Java で作成する方法がわかりません。

私は周りを検索し、私が欲しいものを正確に説明しているこの投稿を見つけました.

残念ながら、私はそれを機能させることができません。

私が試しているコードの最も単純な例を次に示します。

Main.java

public static void main(String[] args) {    
    LuaValue _G = JsePlatform.standardGlobals();
    _G.load(new MyLib());
    _G.get("dofile").call( LuaValue.valueOf("Files/Fighters/Sticky/prop/test.lua"));
    LuaValue MyAdd = _G.get("MyAdd");
    LuaValue retvals = MyAdd.call(LuaValue.valueOf(4), LuaValue.valueOf(-110));
}

MyLib.Java

public class MyLib extends OneArgFunction {
    public static MyLib MYLIB = null;
    public MyLib() {
        MYLIB = this;
    }

public LuaValue call(LuaValue env) {
        LuaTable mine = new LuaTable(0,30); // I think "new LuaTable()" instead of "(0, 30)" is OK
        mine.set("someFunc", new SomeFunc());
        env.set("mine", mine);
        env.get("package").get("loaded").set("mine", mine);
        return mine;
    }
}

SomeFunc.java

abstract class UnaryOp extends OneArgFunction {
    public LuaValue call(LuaValue arg) {
        return valueOf(call(arg.checkdouble()));
    }
    abstract protected double call(double d);
}

final class SomeFunc extends UnaryOp {
    protected double call(double d) {
        return Math.abs(d);
    }
}

test.lua

require "mine"
function MyAdd( num1, num2 )
   return mine.someFunc(num2-2)
end
function MySubtract( num1, num2 )
    return num1 - num2
end
function MyMult( num1, num2 )
    return num1 * num2
end

私が得るエラーはですindex expected, got string。これは、env.set("mine", mine);「MyLib.java」内の行で発生します。

完全なエラー メッセージ

Exception in thread "main" org.luaj.vm2.LuaError: index expected, got string
at org.luaj.vm2.LuaValue.typerror(Unknown Source)
at org.luaj.vm2.LuaValue.settable(Unknown Source)
at org.luaj.vm2.LuaValue.set(Unknown Source)
at org.luaj.vm2.LuaValue.set(Unknown Source)
at luajClasses.MyLib.call(MyLib.java:17)
at org.luaj.vm2.lib.OneArgFunction.call(Unknown Source)
at org.luaj.vm2.LuaValue.load(Unknown Source)
at luajClasses.Main.main(Main.java:17)
4

1 に答える 1

2

私はコードをいじり、Luaj Getting Started ページを読み直し、それを理解しました。

「MyLib.Java」ファイルで行ったようにライブラリを作成する場合、ライブラリを設定するために lua 変数が必要です。この変数はタイプ「LuaTable」である必要があります。

私のように「OneArgFunction」を拡張すると、LuaValue が 1 つだけ取得されます。実際には「LuaTable」ではなく「LuaString」型です。

修正は、2 番目の値が実際の「env」LuaTable であるため、MyLib クラスが twoArgFunction を拡張するようにすることでした。

誰にも役立つ場合に備えて、結果のコード:

public class MyLib extends TwoArgFunction {
    public static MyLib MYLIB = null;
    public MyLib() {
        MYLIB = this;
    }

public LuaValue call(LuaValue modname, LuaValue env) {
        LuaTable mine = new LuaTable(0,30);
        mine.set("someFunc", new SomeFunc());
        env.set("mine", mine);
        env.get("package").get("loaded").set("mine", mine);
        return mine;
    }
}

詳細については、Luaj Getting Started ページにアクセスして、「Libraries of Java Functions」までスクロールすることをお勧めします。

于 2014-11-15T19:55:01.183 に答える