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