On Aug 20, 2008, at 3:04 PM, Douglas Adler wrote:
I am trying to allocate the memory for a bitmap in java and have a C
library manipulate it.
I have found that I can do the following:
Memory ptr = new Memory(pixWidth * pixHeight * pixDepth);
I then pass the ptr to the C routines via JNA, when the library is
done I do the following to get the image to the screen:
renderImage = (BufferedImage) createImage(width, height);
int [] buffer = ptr.getIntArray((long) 0, (int) ptr.getSize() / 4);
renderImage.setRGB(0, 0, pixWidth, pixHeight, buffer, 0, pixWidth);
g2d.drawImage(renderImage, 0, 0, width, height, null);
All of this works fine, except it can’t keep up at a decent frame
rate if the bitmap gets large (> 320x240).
If I comment out the ptr.getIntArray() line then both the native
library and the java app can run without dropping frames.
Is there a way to get a JNA Pointer directly from the int [] so that
I don’t have to do the copy that ptr.getIntArray() must be doing?
That way the setRGB() method will simply operate on the existing int
[] that is being manipulated in the C library as ptr.
Pointer, java.nio.Buffer, and primitive arrays are interchangeable,
just change your function declaration (or declare all three and
compare performance).
In addition, there's a Pointer.read() method that reads into an
existing int[] to avoid allocating a new one every time.