3

在我们的项目中,我尝试从具有可变数量参数的 lua 调用 java 方法。所以java-method的代码看起来像:

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”-参数或添加更多参数也不起作用。

所以也许你们中的任何人曾经在 Lua 文件中使用过带有可变参数的 java 方法,并且可以给我一个提示,我可以如何解决这个问题。我只是不想在 Lua 文件中使用太多代码行,因为我需要创建一个 ArrayList 并添加参数并将这个 ArrayList 传递给 Java 方法。所以也许还有一种简单的方法来创建一个数组,我可以将它作为数组传递给 Java。所以解决方案不一定要使用 vargs,但我认为这将是一种简单的方法。

感谢您提前提供任何帮助

4

3 回答 3

1

可变参数(例如Object... args)实际上是 类型Object[]

LUA(可能)无法识别可变参数并动态创建数组,所以试试这个:

mgr:addEvent( "luaFile.lua", "doSomething", 3000, {var})
于 2012-03-06T22:44:44.177 回答
1

不幸的是,LuaJava 目前不支持 Java 数组。它不允许构造新的 Java 数组,也不支持对数组的操作(获取和设置值)。因此它无法支持Object... args语法。

您可以通过使用带有 0、1、2、3 个参数的专用方法来解决此问题(我认为您不需要超过 3 个)。然后,您将添加一个调用适当函数的 Lua 可变参数函数。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}));
}
于 2012-03-08T19:43:44.280 回答
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())
于 2021-07-10T07:18:51.973 回答