将java库函数加载到Luaj

bys*_*reg 2 java lua luaj

我坚持加载java函数,以便可以使用luaj从lua文件中调用它.

我目前做的是创建这样的东西:

在some_package/aif.java中:

package some_package;

public class aif extends TwoArgFunction {

    public aif() {
    }

    @Override
        public LuaValue call(LuaValue modname, LuaValue env) {
        LuaValue library = tableOf();
        library.set("foo", new foo());
        env.set("aif", library);
        return library;
    }

    //the rest contains the implementations of java functions
}
Run Code Online (Sandbox Code Playgroud)

然后在lua文件中:

require "some_package/aif"
--etc ...
Run Code Online (Sandbox Code Playgroud)

然后在Main.java文件中:

public static void Main(String[] args) {
    String script = "lib/some_lua_file.lua";
    globals = JsePlatform.standardGlobals();
    LuaValue chunk = globals.loadFile(script);
    chunk.call( LuaValue.valueOf(script) );         
}
Run Code Online (Sandbox Code Playgroud)

这段代码有效,但我想要的是在lua文件中我们不必使用"require".我已经类似地实现了这一点,但在c ++中使用这一行:

luaL_requiref(L, "aif", luaopen_aiflib, 1);
Run Code Online (Sandbox Code Playgroud)

我们可以在luaj那样做吗?我试过了 :

globals.load(new aif());
Run Code Online (Sandbox Code Playgroud)

但在线程"main"中获取异常org.luaj.vm2.LuaError:索引预期,得到nil(aif类的调用函数中的变量env为nil)

有谁知道如何设置aif作为lua libary与luaj一起使用?

小智 6

您可以编写MyXArgImpl,如下所示:

package mypackage;

import org.luaj.vm2.LuaValue;
import org.luaj.vm2.lib.ZeroArgFunction;

public class MyZeroArgImpl extends ZeroArgFunction {
    public LuaValue call() {
        return valueOf("My Zero Arg Implementation");
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将其添加到您的LUA,如下所示:

LuaValue globals = JsePlatform.standardGlobals();
globals.get("dofile").call( LuaValue.valueOf(yourScriptfile));
globals.set("callMyFunction", new MyZeroArgImpl());
Run Code Online (Sandbox Code Playgroud)

现在,即使没有require('...'),您也可以在LUA脚本中调用您的函数:

print(callMyFunction())
Run Code Online (Sandbox Code Playgroud)