3

我一直在加载 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
}

然后在lua文件中:

require "some_package/aif"
--etc ...

然后在 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) );         
}

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

luaL_requiref(L, "aif", luaopen_aiflib, 1);

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

globals.load(new aif());

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

有人知道如何将 aif 设置为 lua 库以与 luaj 一起使用吗?

4

3 回答 3

7

你可以像下面这样编写你的 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");
    }
}

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

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

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

print(callMyFunction())
于 2013-10-28T08:18:01.567 回答
4

在查看了 Lua 库的 luaj 实现后,我找到了答案。

我修改了我的代码:

package some_package;

public class aif extends OneArgFunction{

    public aif() {
    }

    @Override
    public LuaValue call(LuaValue env) {
        Globals globals = env.checkglobals();
        LuaTable aif = new LuaTable();
        aif.set("foo", new foo());
        env.set("aif", aif);
        globals.package_.loaded.set("aif", aif);
        return aif;
    }

    //the rest contains the implementations of java functions
}

我将 aif 类编码为 TwoArgFunction 是因为教程说要这样做。现在有了上面的代码,不需要lua文件中的类

于 2013-04-26T12:10:39.693 回答
3

假设您正在加载的脚本有一个函数“receive_aif”

function receive_aif( aifObj )

    --This is how you can invoke public function associated with aifObj     
    aifObj:someAifFunction()

end

从 java 中,您可以将 aif 实例传递为:(这应该适用于任何 java 对象)

aif aifObj = new aif()
LuaValue receive_aif_handle = globals.get("receive_aif");
LuaValue retvals = receive_aif_handle.call( CoerceJavaToLua.coerce( aifObj ) );

我使用“3.0 aplha-2”版本在我的应用程序中使用类似的结构

于 2013-04-19T21:57:36.890 回答