Вызовите Java-метод с аргументами переменного числа из Luafile с LuaJava - PullRequest
3 голосов
/ 07 марта 2012

в нашем проекте я пытаюсь вызвать метод Java из lua, который имеет переменное число аргументов. Итак, код java-метода выглядит так:

public static void addEvent( String luaFile, String function, 
                             int milliseconds, Object...args )
{
    events.add( new TimerEvent( luaFile, function, milliseconds, args ) );
}

Я хочу вызвать этот метод из файла lua со строкой:

mgr:addEvent( "luaFile.lua", "doSomething", 3000, var )

Но, используя Luajava, я всегда получаю сообщение об ошибке:

PANIC: unprotected error in call to Lua API (Invalid method call. No such method.)

Даже удаление аргумента "var" или добавление еще нескольких аргументов не работает.

Так что, возможно, кто-нибудь из вас когда-либо использовал java-метод с переменными аргументами в Lua-файле и может дать мне подсказку, как я могу решить эту проблему. Я просто не хочу использовать слишком много строк кода в Lua-файле, так как мне нужно было бы создать ArrayList и добавить аргументы и передать этот ArrayList в Java-метод. Так что, возможно, есть также простой способ создать массив, который я могу передать как массив в Java. Так что решение не обязательно должно использовать vargs, но я подумал, что это будет легкий путь.

Спасибо за любую помощь заранее

Ответы [ 2 ]

1 голос
/ 08 марта 2012

К сожалению, массивы Java в настоящее время не поддерживаются LuaJava.Он не позволяет создавать новые массивы Java и не поддерживает операции с массивами (получение и установка значений).Поэтому он не может поддерживать синтаксис Object... args.

Вы можете обойти это, используя специализированные методы, которые принимают 0, 1, 2, 3 аргумента (я не думаю, что вам понадобится больше 3).Затем вы бы добавили функцию Lua vararg, которая вызывает соответствующую функцию.Пример для вызова с тремя аргументами:

public static void addEvent3( String luaFile, String function, 
                             int milliseconds, Object arg1, Object arg2, Object arg3 )
{
    events.add(new TimerEvent(luaFile, function, milliseconds, new Object[] {arg1, arg2, arg3}));
}
1 голос
/ 07 марта 2012

Параметр varargs (например, Object... args) действительно имеет тип Object[].

LUA (вероятно) не способен распознавать varargs и динамически создавать массив, поэтому попробуйте следующее:

mgr:addEvent( "luaFile.lua", "doSomething", 3000, {var})
...