从Luaj运行Java方法,“期望索引,得到字符串”。

我正在开发一个小项目,希望包括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。这是在"MyLib.java" 中的 env.set("mine", mine);这行代码引起的错误。

Full Error Message

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)
点赞
用户2280073
用户2280073

我对代码进行了调整,并重新阅读了LuaJ入门页面,最终解决了问题。

当创建一个库时,例如我在"MyLib.Java"文件中所做的那样,需要一个lua变量来设置库。该变量应为"LuaTable"类型。

当像我这样扩展"OneArgFunction"时,您只会得到一个LuaValue,它实际上是"LuaString"类型,而不是"LuaTable"类型。

解决方法是将MyLib类扩展为twoArgFunction,因为第二个值是真正的“env”LuaTable。

下面是最终的代码,希望对大家有所帮助:

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入门页面,然后向下滚动到“Java函数库”。

2014-11-15 19:55:01