2012-06-28 3 views
2

Итак, у меня есть сценарий, который идет следующим образом:Вызов функции Lua из LuaJ

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

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

ответ

1

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

+0

Ум более точным? Я не вижу никакого способа захватить объект LuaFunction, кроме того, когда загружается скрипт (что бы не сработало, как бы я вызвал сам метод?) – PuppyKevin

+0

Кроме того, при поиске более [этот вопрос] (http: //stackoverflow.com/questions/8956564/luaj-import-lua-methods) - это тот же самый вопрос, что и у меня, но он не оставил свой метод выполнения работы. – PuppyKevin

+0

Я не думаю, что это правильный ответ, поскольку LuaFunction используется для внутреннего использования, для разработчика Java для интерпретации/выполнения функции библиотеки lua. – Splash

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 

Примечание: я не тестировал код, но думаю, что что-то подобное должно работать.

Редактировать: В то время как я искал, я не понимал, что этот вопрос не имел никакого отношения к Скале (я сам искал проблему в Скале, когда я сюда попал). Тем не менее, demon_ds1, похоже, нашел решение в Java на основе моего ответа, и теперь он дал свой собственный ответ, поэтому я рад, что из этого путаного ответа вышло что-то хорошее!

11

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