将Java库函数加载到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
 }
 
 ```
 

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

但是得到了异常“org.luaj.vm2.LuaError:预期索引,得到 nil(aif 类的调用函数中的变量 env 为 nil)”。

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

点赞
用户1919896
用户1919896

假设你加载的脚本里有一个名为"receive_aif"的函数

function receive_aif (aifObj)

    --这是你如何调用与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.0alpha-2”发布版本

2013-04-19 21:57:36
用户854058
用户854058

我在查看 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;
    }

    //其余代码包括 Java 函数的实现
}

我将 aif 类中的 TwoArgFunction 改成了 OneArgFunction,因为教程中建议这样做。现在使用上面的代码,就不需要在 lua 文件中 require 这个类了。

2013-04-26 12:10:39
用户2927268
用户2927268

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

现在你可以在你的 LUA 脚本中调用你的函数,即使不使用 require('...'):

print(callMyFunction())
2013-10-28 08:18:01