LuaJava индексирует массивы Java в Lua

В моем приложении мне нужен мой скрипт lua для индексации массива java. По какой-то причине я не понимаю, я не могу индексировать массив вообще в Lua. Вот мой файл Lua (test_lua.lua): https://pastebin.com/zQUPVArz

Вот файл Java, вызывающий этот код (эксперимент. Экспериментальный класс): https://pastebin.com/Gr9EsvbM

А вот интерфейс Bobject: https://pastebin.com/agdS41sc

Используя этот метод, я не могу ничего сделать с массивами Java от Lua. Я даже пытался использовать отражение и 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

До этого кода я также пытался загрузить себя самого Java_Table в качестве объекта LuaTable, используя явно приведенные приведения, с чем-то вроде этого:

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

... Таким образом, вызывая функцию из таблицы и вызывая объекты Java самостоятельно, вместо того, чтобы скрипт возвращал экземпляр Bobject с переопределенными функциями. Этот метод не изменил результат вообще.

Я просто использую неправильный синтаксис для индексации приведенного массива? Я чувствую, что он принудительно выполняется, учитывая, что я могу напечатать его с помощью toString() и получить доступ к его длине. Я думаю, что массив приведен в таблицу lua, правильно? Если это так, как мне индексировать его значения? Я все еще очень плохо знаком с концепцией "столов" Луа

Спасибо за ваше время.

1 ответ

Решение

Еще раз, мне удалось решить мою собственную проблему в конце. Я прочитал таблицы Lua и нашел свой путь к этому вопросу переполнения стека: открыть массивы или списки массивов в Lua (преобразование массива в таблицу)

В итоге я написал метод на 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

...и так далее.

Другие вопросы по тегам