You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Invoking a method that modifies an input parameter #83
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 the out parameter which I would like to pick Julia side.
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).
Activity
dfdx commentedon Aug 18, 2018
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
ArrayListor 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 constructbyte[]usingNewByteArray,int[]usingNewIntArray,Object[]usingNewObjectArray, etc.; access to elements is also specific for each array type).sorokod commentedon Aug 19, 2018
Yes, an adapter can work, but an extra copy is a concern.
dfdx commentedon Aug 19, 2018
If you have a lot of code already working with
byte[], you can create a no-copy wrapper for it instead ofArrayList. Something like: