LuaJava 在 Lua 中索引 Java 个数组

LuaJava indexing Java arrays in Lua

在我的应用程序中,我需要 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)              -- Prints array length correctly
    print(array)                                -- Prints the array using toString(), resulting in [Ljava.lang.Object;@2d363fb3
    print(array[0])                             -- prints 'nil'
    Array = luajava.bindClass("java.lang.reflect.Array")
    Coerce = luajava.bindClass("org.luaj.vm2.lib.jse.CoerceLuaToJava")
    array[0] = 4                                -- Throws a LuaError: index expected, got userdata
    print(array[0])                             -- prints 'nil', as before
    print(Array.get(Coerce.coerce(array), 0))   -- Throws a NullPointerException
end

在此代码之前,我还尝试使用显式强制类型将 behavior_table 本身作为 LuaTable 对象加载到 Java 中,使用类似这样的方法:

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

...因此从 table 调用函数并自己强制 Java 对象,而不是让脚本 return 具有重载函数的 Bobject 实例。 这种方法根本没有改变结果。

我是否只是使用了不正确的语法来索引强制数组?我觉得它被正确地强制了,因为我可以使用 toString() 打印它并访问它的长度。我认为数组被强制转换为 lua table,对吗?如果是这样,我如何 do 索引它的值?我对 Lua 的 "tables"

的概念还是很陌生

感谢您的宝贵时间。

再一次,我终于解决了自己的问题。 我阅读了 Lua 个表格并找到了解决这个堆栈溢出问题的方法:Open Arrays or ArrayLists in Lua (Convert array to table)

我最终在 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 方法绑定到 class,我可以像这样操作 lua 脚本中的任何值:

function behavior.update(entity, world, elapsed)
    e = luautils:arrayToTable(world:getComponents()) 
    -- getComponents() returns a 3-dimensional Java array
    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

...等等。