2

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

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

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

4

4 回答 4

12

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

测试.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));
    }
}

测试.lua:

function MyAdd( num1, num2 )
    return num1 + num2
end
于 2012-11-05T12:31:16.747 回答
2

我不知道,也许这就是您想要做的:(这将为您提供 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))
}

测试.lua:

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

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

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

于 2012-11-04T13:58:22.047 回答
1

快速浏览一下LuaJ 文档,在我看来,您必须获取org.luaj.vm2.LuaFunction表示 Lua 函数的对象,然后invoke在其上应用该方法。

于 2012-06-29T07:32:22.727 回答
0

这些例子真的很有帮助。无论如何,从 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

于 2012-07-03T19:21:39.150 回答