Вызов функции Lua из LuaJ

Итак, у меня есть скрипт, который выглядит так:

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

Я могу вызывать функции Java из Lua, но как мне добиться обратного? Как вызвать функцию Lua из Java с помощью LuaJ?

4 ответа

Решение

Беглый взгляд на документы LuaJ, мне кажется, что вы должны получить org.luaj.vm2.LuaFunction объект, представляющий функцию Lua, затем применить invoke метод на это.

Я искал вокруг, чтобы решить эту проблему, и я нашел что-то очень похожее на ответ Профетилена

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 на основе моего ответа, и теперь он дал свой собственный ответ, поэтому я рад, что что-то хорошее вышло из этого запутанного ответа!

Примеры действительно полезны. В любом случае очень просто вызвать Lua-код из java, так как вы всегда можете сделать это через что-то вроде 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

Другие вопросы по тегам