我正在开发一个小项目,并希望包含lua脚本,以便用户可以创建自己的内容。我已经完成了大部分工作。我可以在java等中加载脚本,运行它们或运行特定的Lua方法。但是我无法弄清楚如何在java中创建一个可以由lua脚本运行的方法。
我四处搜寻,发现this post描述了我想要的东西。
不幸的是,我无法让它发挥作用。
以下是我正在尝试的最简单的代码示例。
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));
}
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;
}
}
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);
}
}
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)
答案 0 :(得分:2)
我搞砸了代码并重新阅读了Luaj Getting Started page并弄明白了。
创建库时,例如我在" MyLib.Java"文件,你需要一个lua变量来设置库。这个变量应该是Type" 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入门页面并向下滚动到#34; Java函数库"