だから、私はそのようなスクリプトを持っています:
function testfunction()
print("Test from testfunction");
end
LuaからJava関数を呼び出すことはできますが、その逆を行うにはどうすればよいですか?LuaJを使用してJavaからLua関数を呼び出すにはどうすればよいですか?
私はこの同じ問題を解決するために周りを見回していました、そして私はプロフェティレンの答えに非常に似た何かを思いつきました
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
わかりません、多分これがあなたがやりたいことです:(これはあなたに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で解決策を見つけたようで、今では彼が自分の答えを出したので、この紛らわしい答えから何か良いものが出てきてうれしいです!
LuaJのドキュメントをざっと見てみるとorg.luaj.vm2.LuaFunction
、Lua関数を表すオブジェクトを取得してから、そのオブジェクトにinvoke
メソッドを適用する必要があるように思われます。
例は本当に役に立ちます。とにかく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