get pointer of byte array in jna

user206646 picture user206646 · Mar 9, 2011 · Viewed 12k times · Source

I have following code in c# and need similar functionality in java using JNA:

IntPtr pImage = SerializeByteArrayToIntPtr(imageData);

public static IntPtr SerializeByteArrayToIntPtr(byte[] arr)
        {
            IntPtr ptr = IntPtr.Zero;
            if (arr != null && arr.Length > 0)
            {
                ptr = Marshal.AllocHGlobal(arr.Length);
                Marshal.Copy(arr, 0, ptr, arr.Length);
            }
            return ptr;
        }

Answer

user186057 picture user186057 · Mar 22, 2011

You want to use Memory

Use it thusly:

// allocate sufficient native memory to hold the java array
Pointer ptr = new Memory(arr.length);

// Copy the java array's contents to the native memory
ptr.write(0, arr, 0, arr.length);

Be aware, that you need to keep a strong reference to the Memory object for as long as the native code that will use the memory needs it (otherwise, the Memory object will reclaim the native memory when it is garbage collected).

If you need more control over the lifecycle of the native memory, then map in malloc() and free() from libc and use them instead.