У меня есть некоторый код Java для обработки изображений в Android, который работает с двумя большими массивами int. В большинстве случаев Java достаточно быстр, но мне нужно использовать C через JNI и NDK, чтобы ускорить несколько операций.
Единственный способ узнать, что я могу передать данные из массивов int в C, - это использовать ByteBuffer.allocateDirect, чтобы создать новый буфер, скопировать в него данные и затем заставить код C воздействовать на буфер.
Однако я не вижу способа манипулировать данными в этом буфере в Java, как если бы буфер был int [] или byte []. Например, вызов 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 секунды.