ByteBuffer, созданный с помощью NewDirectByteBufer (), не имеет массива - PullRequest
3 голосов
/ 18 февраля 2012

Я новичок в JNI, и у меня есть требование использовать DirectBuffers для передачи объемных данных изображения с Java на C ++ и обратно с C ++ на Java.

Я выделил прямую память в коде Java с использованием allocateDirect и заполнил ее следующим образом:

ByteBuffer myBuffer = ByteBuffer.allocateDirect(size);
myBuffer.orger(ByteOrder.nativeOrder());
myBuffer.put(imageByteArrayData);
SetImage(myBuffer)//MyNativeMethod in JNI

Я делаю:

static void SetImage(JNIEnv* env, jobject thiz, jobject myBuffer)

{
char* marker = (char*)env->GetDirectBufferAddress(myBuffer);
gImageProcessor->ProcessImage(marker);//My other cpp class which process this image add some effects
}

Когда я проверил адрес этого маркера в cpp и адрес myBuffer в Java (через окно переменных в режиме отладки), оба указали на один и тот же адрес.

Теперь мне нужно вернуть это изображение в какой-то другой модуль Java, который никак не связан с моим более ранним модулем Java, который выделил прямой буфер.

Итак, я вызвал метод getProcessedImage () в ImageProcessor.cpp, который будет возвращать указатель char * на JNI.

Мой вопрос здесь такой: как я могу вернуть эти данные в Java без дополнительной копии массива. Я попытался использовать NewDirectByteBuffer в JNI следующим образом:

static jobject GetUpdatedImage(JNIEnv* env, jobject thiz)
{
gData = gImageProcessor->getProcessedImage();
jobject = (jobject)env->NewDirectByteBufer(gData, sizeofgdata);
return jobject;
}

Но на уровне Java, когда я конвертирую jobject в ByteBuffer, я вижу, что адрес, представленный этим объектом, является тем же прямым адресом, но .hasarray (), .array () и вызов любого метода на нем приводит к UnSupportedOperationException.

Я искал разные сообщения, но не получил никакой информации. Может ли кто-нибудь помочь мне в этом отношении?

1 Ответ

0 голосов
/ 29 февраля 2012

Прямые буферы не имеют связанного резервного массива Java, по крайней мере, в обычных JVM;Вы не можете использовать их как таковые.Если вам нужны данные в массиве Java, как только вы получите метод ByteBuffer, вы можете использовать операцию массового получения () для копирования байтов в массив Java.Или вы можете работать с ByteBuffer напрямую, используя при необходимости get / put для чтения / записи данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...