2

在我的应用程序中,我需要我的 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 本身作为 Java 中的 LuaTable 对象加载,如下所示:

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

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

我只是使用不正确的语法来索引强制数组吗?我觉得它被正确地强制了,因为我可以使用 toString() 打印它并访问它的长度。我认为数组被强制转换为 lua 表,对吗?如果是这种情况,我如何索引它的值?我对 Lua 的“表”的概念还是很陌生

感谢您的时间。

4

1 回答 1

1

再一次,我最终设法解决了我自己的问题。我阅读了 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,我可以像这样操作 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

...等等。

于 2017-12-12T14:47:15.860 回答