【问题标题】:Running Java method from Luaj, "index expected, got string"从 Luaj 运行 Java 方法,“预期索引,得到字符串”
【发布时间】:2015-01-12 12:37:32
【问题描述】:

我正在处理一个小项目,并希望包含 lua 脚本,以便用户可以创建自己的内容。我已经让它大部分工作了。我可以加载脚本,运行它们,或者从 java 中运行特定的 Lua 方法等。但是我不知道如何在 java 中创建一个可以由 lua 脚本运行的方法。

我四处搜索,发现this post 准确地描述了我想要的。

不幸的是,我无法让它工作。

这是我正在尝试的最简单的代码示例。

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); 行引起的

完整的错误信息

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)

【问题讨论】:

  • 1.在 Main.java 中使用 LuaValue x = _G.loadFile('your/test.lua'); x.call( LuaValue.valueOf('your/test.lua') );。 2.尝试将全局变量加载为Globals g = env.checkGlobals(); g.package_.loaded.set("mine", mine);
  • 我已经按照你说的更新了 Main。在 MyLib.java 中加载全局变量后,“.loaded”对我来说似乎不存在。
  • 好吧,这最终成为问题的一部分。感谢您的帮助!

标签: java api methods lua luaj


【解决方案1】:

我弄乱了代码并重新阅读了Luaj Getting Started page并弄清楚了。

创建库时,例如我在“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 函数库”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 2016-04-12
    相关资源
    最近更新 更多