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
...и так далее.