我在Android的Java代码中有一些图像处理代码,作用于两个大的int数组。大多数情况下,Java足够快,但我需要使用JNI和NDK中的C来加速一些操作。
我所知道唯一的方法是使用ByteBuffer.allocateDirect创建一个新缓冲区,将数据复制到其中,然后让C代码对缓冲区进行操作。但是,我无法想到任何办法在Java中操作此缓冲区,就好像缓冲区是int[]或byte[]一样。例如,对newly created buffer调用ByteBuffer.array()会失败。有没有办法让它起作用?
我内存有限,想要减少所需的数组/缓冲区数量。例如,如果我可以使用IntBuffer.wrap(new int[...])创建缓冲区,然后直接在Java中操作支持缓冲区的数组,那将很不错,但是我无法这样做,因为在这里对于JNI似乎唯一有效的是ByteBuffer.allocateDirect。
是否有其他方式在C和Java之间发送数据?我能否在C端分配内存,让Java直接向那里发送数据?
编辑:比较缓冲区使用和int[]使用的基准测试:
我所知道唯一的方法是使用ByteBuffer.allocateDirect创建一个新缓冲区,将数据复制到其中,然后让C代码对缓冲区进行操作。但是,我无法想到任何办法在Java中操作此缓冲区,就好像缓冲区是int[]或byte[]一样。例如,对newly created buffer调用ByteBuffer.array()会失败。有没有办法让它起作用?
我内存有限,想要减少所需的数组/缓冲区数量。例如,如果我可以使用IntBuffer.wrap(new int[...])创建缓冲区,然后直接在Java中操作支持缓冲区的数组,那将很不错,但是我无法这样做,因为在这里对于JNI似乎唯一有效的是ByteBuffer.allocateDirect。
是否有其他方式在C和Java之间发送数据?我能否在C端分配内存,让Java直接向那里发送数据?
编辑:比较缓冲区使用和int[]使用的基准测试:
int size = 1000;
IntBuffer allocateDirect = java.nio.ByteBuffer.allocateDirect(4 * size).asIntBuffer();
for (int i = 0; i < 100; ++i)
{
for (int x = 0; x < size; ++x)
{
int v = allocateDirect.get(x);
allocateDirect.put(x, v + 1);
}
}
int[] intArray = new int[size];
for (int i = 0; i < 100; ++i)
{
for (int x = 0; x < size; ++x)
{
int v = intArray[x];
intArray[x] = v + 1;
}
}
在Droid手机上,缓冲区版本需要约10秒才能完成,而数组版本只需要约0.01秒。
ByteBuffer.asIntBuffer
有什么问题吗?你真的需要一个int[]
吗? - ephemient