【问题标题】:Loading java library functions to Luaj将 java 库函数加载到 Luaj
【发布时间】:2013-04-12 17:25:56
【问题描述】:

我一直在加载 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 一起使用吗?

【问题讨论】:

    标签: java lua luaj


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      看了 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文件中的类了

      【讨论】:

        【解决方案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”版本的应用程序中使用了类似的构造

        【讨论】:

        • 这个我没试过。只是我有使用 lua 函数的 java 和 c++ 应用程序,并且我试图使 lua 代码在用于 c++ 时不需要不同。我已经同时工作了,不同之处在于 java 的 lua 文件有“需要 some_package/aif”,而 c++ 的 lua 文件没有。所以我试图找到对他们都适用的解决方案(您的解决方案需要不同的 c++ 和 java 代码)
        猜你喜欢
        • 2014-01-31
        • 2016-04-29
        • 1970-01-01
        • 2015-12-12
        • 2014-03-31
        • 1970-01-01
        • 2012-06-30
        • 2013-01-08
        • 2019-10-12
        相关资源
        最近更新 更多