2

In my application, I need my lua script to index a java array. For some reason I don't understand, I can't index the array at all within Lua. Here is my Lua file (test_lua.lua): https://pastebin.com/zQUPVArz

Here is the Java file calling this code (experiment.Experimental.class): https://pastebin.com/Gr9EsvbM

And here is the Bobject interface: https://pastebin.com/agdS41sc

Using this method, I am unable to do anything with Java arrays from Lua. I even tried using reflection and CoerceLuaToJava to index the array, but to no avail. Below is the offending Lua code:

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

Prior to this code, I also tried loading the behavior_table itself as a LuaTable object in Java, using explicitly typed coercions, with something like this:

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

...Thus calling the function from the table and coercing the Java objects myself, as opposed to having the script return a Bobject instance with overidden functions. This method didn't change the outcome at all.

Am I just using the improper syntax for indexing the coerced array? I feel like it's being coerced properly, given that I can print it using toString() and access its length. I think the array is coerced into a lua table, correct? If that's the case, how do I index its values? I'm still very new to the concept of Lua's "tables"

Thank you for your time.

1
  • Even though you may be calling Lua code from Java, your question is not actually about java, and thus the tag is not appropriate for this question. I have removed it for you. Commented Dec 6, 2017 at 20:23

1 Answer 1

1

Once again, I managed to solve my own issue in the end. I read up on Lua tables and found my way to this stack overflow question: Open Arrays or ArrayLists in Lua (Convert array to table)

I ended up writing a method in Java to coerce each individual object in my Java array, and place it into a LuaTable object. I called this method from my Lua script and was able to manipulate it as I wished.

I included a bit of recursion that coerces multi-dimensional arrays, by checking if array[i] instanceof Object[]

Here's the code I wrote in 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;
}

With luautils being a binding to the class with my arrayToTable method, I'm able to manipulate any value from my lua script like this:

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

Output:

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

...and so on.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.