在我们的项目中,我尝试从lua调用一个java方法,它有一个可变数量的参数。所以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”-argument或添加更多参数也不起作用。
所以也许你们中的任何人曾经在Lua文件中使用过带有变量参数的java方法,并且可以给我一个如何解决这个问题的提示。 我只是不想在Lua文件中使用太多代码行,因为我需要创建一个ArrayList并添加参数并将此ArrayList传递给Java方法。所以也许有一种简单的方法来创建一个我可以作为Array传递给Java的数组。 因此,解决方案不一定必须使用vargs,但我认为这将是一种简单的方法。
感谢您提前提供任何帮助
答案 0 :(得分:1)
varargs参数(例如Object... args
)实际上是Object[]
类型。
LUA(可能)无法识别varargs并动态创建数组,所以试试这个:
mgr:addEvent( "luaFile.lua", "doSomething", 3000, {var})
答案 1 :(得分:1)
不幸的是,LuaJava目前不支持Java数组。它不允许构建新的Java数组,也不支持使用数组操作(获取和设置值)。因此,它无法支持Object... args
语法。
你可以通过使用带有0,1,2,3个参数的专门方法解决这个问题(我认为你不需要超过3个)。然后你会添加一个调用相应函数的Lua vararg函数。 3参数调用的示例:
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}));
}
答案 2 :(得分:0)
public static Object[] ConvertTableToArray(LuaTable table, Class toClass) {
var array = Array.newInstance(toClass, table.length());
for (int i = 0; i < table.length(); i++) {
var v = table.get(i + 1).touserdata(toClass);
Array.set(array, i, v);
}
return (Object[]) array;
}
在 lua 中调用它。 确保 luatable 只包含 toClass 类型的对象。 示例:
JavaClass:ConvertTableToArray({obj1,obj2,obj3},obj1:getClass())