【问题标题】:Calling a Lua function from LuaJ从 LuaJ 调用 Lua 函数
【发布时间】:2012-06-30 11:47:30
【问题描述】:

所以,我有一个这样的脚本:

function testfunction()
    print("Test from testfunction");
end

我可以从 Lua 中调用 Java 函数,但是我该如何完成相反的操作呢?如何使用 LuaJ 从 Java 调用 Lua 函数?

【问题讨论】:

    标签: java lua luaj


    【解决方案1】:

    快速查看LuaJ docs,在我看来,您必须获取org.luaj.vm2.LuaFunction 对象,代表Lua 函数,然后对其应用invoke 方法。

    【讨论】:

    • 介意更精确吗?除了加载脚本时,我看不到任何获取 LuaFunction 对象的方法(这不起作用,我将如何调用该方法本身?)
    • 另外,在搜索更多内容时,this question 与我的问题完全相同,但提问者并没有离开他完成工作的方法。
    • 我不认为这是正确的答案,因为 LuaFunction 是供内部使用的,供 Java 开发人员解释/执行 lua 库函数。
    【解决方案2】:

    这些例子真的很有帮助。无论如何,从 java 调用 Lua 代码是非常简单的,因为你总是可以通过类似 loadstring 的方式来完成。

    https://github.com/sylvanaar/luaj/blob/master/luaj-vm/examples/jse/SampleJseMain.java

    https://github.com/sylvanaar/luaj/blob/master/luaj-vm/examples/jse/ScriptEngineSample.java

    【讨论】:

      【解决方案3】:

      我不知道,也许这就是你想要做的: (这将为您提供 Scala 内部的返回值)

      Main.scala:

      import org.luaj.vm2._
      import org.luaj.vm2.lib.jse._
      
      object Main extends App {
          val global = JsePlatform.standardGlobals()
          global.get("dofile").call(LuaValue.valueOf("test.lua"))
      
          val args: Array[LuaValue] = Array(LuaValue.valueof(1), LuaValue.valueof(2))
          val retVals: LuaValue.Vararg = global.get("add").invoke(LuaValue.varargsOf(args))
      
          println(retVals.arg(1))
      }
      

      test.lua:

      function add(a, b)
          a = a or 0
          b = b or 0
          return a + b
      end
      

      注意:我没有测试代码,但它认为这样的东西应该可以工作。

      编辑: 在谷歌搜索时,我没有意识到这个问题与 Scala 完全无关(当我来到这里时,我自己正在寻找在 Scala 中解决问题)。但是,demon_ds1 似乎根据我的回答在 Java 中找到了解决方案,现在他给出了自己的答案,所以我很高兴这个令人困惑的答案能带来一些好处!

      【讨论】:

        【解决方案4】:

        我正在四处寻找解决同样的问题,我想出了与 Profetylen 的答案非常相似的东西

        test.java:

        import org.luaj.vm2.LuaValue;
        import org.luaj.vm2.lib.jse.JsePlatform;
        
        public class test
        {
            public static void main(String[] args)
            {
                //run the lua script defining your function
                LuaValue _G = JsePlatform.standardGlobals();
                _G.get("dofile").call( LuaValue.valueOf("./test.lua"));
        
                //call the function MyAdd with two parameters 5, and 5
                LuaValue MyAdd = _G.get("MyAdd");
                LuaValue retvals = MyAdd.call(LuaValue.valueOf(5), LuaValue.valueOf(5));
        
                //print out the result from the lua function
                System.out.println(retvals.tojstring(1));
            }
        }
        

        test.lua:

        function MyAdd( num1, num2 )
            return num1 + num2
        end
        

        【讨论】:

          猜你喜欢
          • 2019-10-12
          • 1970-01-01
          • 2016-04-29
          • 2014-01-31
          • 2013-01-08
          • 2015-12-12
          • 2014-09-01
          • 2011-03-26
          相关资源
          最近更新 更多