Open sorokod opened 5 years ago
JavaCall automatically converts Julia arrays to Java arrays and vice versa, but they don't share memory. What you pass to the Java method is actually a copy, that's why the argument isn't modified.
If you can add custom class to JVM, then the easiest way to overcome it would be to change signature to take ArrayList
or return modified array (although this will lead to double conversion - between Julia and Java arrays).
Another approach would be to wrap Java arrays into a special type (say, JavaArrray
) that you can pass and extract explicitly. But it's quite a big piece of work since Java treats all the primitive and object arrays differently (e.g. you construct byte[]
using NewByteArray
, int[]
using NewIntArray
, Object[]
using NewObjectArray
, etc.; access to elements is also specific for each array type).
Yes, an adapter can work, but an extra copy is a concern.
If you have a lot of code already working with byte[]
, you can create a no-copy wrapper for it instead of ArrayList
. Something like:
class ArrayWrapper {
private byte[];
// constructor and accessors
}
I am invoking a Java method that accepts an array as a parameter and returns an int, something like
int method(byte[] out)
.method
is modifying theout
parameter which I would like to pick Julia side.On Julia side I have:
But what I see is that
jout
is not affected by the invocation. How do I implemented this invocation pattern with JavaCall?