所以,我有一个类似的脚本:
function testfunction()
print("Test from testfunction");
end
我可以从Lua调用Java函数,但是如何完成相反的操作呢?如何使用LuaJ从Java调用Lua函数?
答案 0 :(得分:12)
我正在四处寻找解决同样的问题,我想出了一些与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
答案 1 :(得分:1)
快速查看LuaJ docs在我看来,您必须获取org.luaj.vm2.LuaFunction
对象,表示Lua函数,然后在其上应用invoke
方法。
答案 2 :(得分:1)
我不知道,也许这就是你想要做的: (这将为您提供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中找到了解决方案,现在他给出了自己的答案,所以我很高兴从这个令人困惑的答案中得到了好处!
答案 3 :(得分:0)
这些例子非常有用。无论如何从java调用Lua代码非常简单,因为你总是可以通过loadtring之类的东西来实现它。
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