使用Luaile和LuaJava调用带有可变数字参数的Java方法

时间:2012-03-06 22:39:00

标签: java lua luajava

在我们的项目中,我尝试从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,但我认为这将是一种简单的方法。

感谢您提前提供任何帮助

3 个答案:

答案 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())