У меня есть код обработки изображений Java на Android, который действует на два больших массива int. В большинстве случаев Java достаточно быстро, но мне нужно использовать C через JNI и NDK для ускорения нескольких операций.
Единственный способ, которым я знаю, что я могу передать данные из массивов int в C, - использовать ByteBuffer.allocateDirect для создания нового буфера, скопировать данные на него и затем сделать код C действующим в буфере.
Однако я не могу видеть, как я могу манипулировать данными в этом буфере в Java, как если бы буфер был int [] или байтом []. Например, вызов ByteBuffer.array() завершится неудачно во вновь созданном буфере. Есть ли способ сделать эту работу?
У меня ограниченная память и вы хотите уменьшить количество массивов/буферов, которые мне нужны. Например, было бы неплохо, если бы я мог использовать IntBuffer.wrap(new int [...]) для создания буфера, а затем манипулировать массивом, поддерживающим буфер непосредственно на Java, но я не могу этого сделать, потому что единственное, что кажется работа здесь для JNI - ByteBuffer.allocateDirect.
Существуют ли другие способы отправки данных между C и Java? Могу ли я как-то выделить память на стороне С и отправить Java прямо туда?
Изменить: сравнительный пример сравнения использования буфера с int [] use:
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 секунды.