LuaJava 在 Lua 中对 Java 数组进行索引

在我的应用程序中,我需要让我的 Lua 脚本对 Java 数组进行索引。但我无法在 Lua 中索引数组,不知道是什么原因。以下是我的 Lua 文件 (test_lua.lua):https://pastebin.com/zQUPVArz

这是调用这段代码的 Java 文件 (experiment.Experimental.class):https://pastebin.com/Gr9EsvbM

这是 Bobject 接口:https://pastebin.com/agdS41sc

使用这种方法,我无法在 Lua 中处理 Java 数组。我甚至尝试使用反射和 CoerceLuaToJava 对数组进行索引,但都没有成功。 以下是有问题的 Lua 代码:

behavior_table.doArray = function(array)
    print("Length:", array.length)              -- 正确打印数组长度
    print(array)                                -- 使用 toString() 打印数组,结果为 [Ljava.lang.Object;@2d363fb3
    print(array[0])                             -- 打印“nil”
    Array = luajava.bindClass("java.lang.reflect.Array")
    Coerce = luajava.bindClass("org.luaj.vm2.lib.jse.CoerceLuaToJava")
    array[0] = 4                                -- 抛出 LuaError:期望索引,得到 userdata
    print(array[0])                             -- 打印“nil”,和之前一样
    print(Array.get(Coerce.coerce(array), 0))   -- 抛出 NullPointerException
end

在这段代码之前,我还尝试在 Java 中将 behavior_table 加载为 LuaTable 对象,并使用明确类型强制转换,像这样:

table.get("doArray").invoke(new LuaValue[]{
    CoerceJavaToLua.coerce(array)
}).arg1()

这样通过表调用函数并强制转换 Java 对象, 而不是返回被覆盖函数的 Bobject 实例。但这种方法并没有改变结果。

我是不是在使用错误的语法来索引转换后的数组?我感觉它已经被正确地转换了,因为我可以使用 toString() 打印它并访问其长度。我认为该数组被转换为 lua 表,对吗?如果是这样,我应该如何索引其值呢?我对 Lua 中的“表”概念还很陌生。

谢谢您的时间。

点赞
用户8748993
用户8748993

我最终成功解决了我的问题。 我查了Lua表并找到了这个stackoverflow问题:在Lua中打开数组或ArrayList(将数组转换为表)

最终,我编写了一个Java方法来强制将我的Java数组中的每个对象,并将其放入LuaTable对象中。我从我的Lua脚本中调用了这个方法,并且能够按照我的意愿进行操作。

我包括了一些递归,通过检查 array[i] instanceof Object[] 判断是否是多维数组。

以下是我在Java中编写的代码:

public static LuaTable arrayToTable(Object[] array) {
    LuaTable result = new LuaTable();

    for(int i = 0; i < array.length; ++i)
        if(array[i] instanceof Object[])
            result.set(i, arrayToTable((Object[])array[i]));
        else
            result.set(i, CoerceJavaToLua.coerce(array[i]));

    return result;
}

使用 luautils 绑定到我的 arrayToTable 方法,我能够像这样从我的Lua脚本中操作任何值:

function behavior.update(entity, world, elapsed)
    e = luautils:arrayToTable(world:getComponents())
    -- getComponents() 返回一个 3 维 Java 数组
    transform = e[1][0][0]
    print("XPOS is: ", transform.xpos)
    transform.xpos = transform.xpos + 1
end

输出:

XPOS is:    20
XPOS is:    21
XPOS is:    22

......以此类推。

2017-12-12 14:47:15