Java native interface 使用newDirectByteBuffer()创建的ByteBuffer中没有数组 我是JNI新手,我需要使用直接缓冲区来把大量的图像数据从java传送到C++,并从C++到java。

Java native interface 使用newDirectByteBuffer()创建的ByteBuffer中没有数组 我是JNI新手,我需要使用直接缓冲区来把大量的图像数据从java传送到C++,并从C++到java。,java-native-interface,Java Native Interface,我使用allocateDirect在Java代码中分配了直接内存,并按如下方式填充: ByteBuffer myBuffer = ByteBuffer.allocateDirect(size); myBuffer.orger(ByteOrder.nativeOrder()); myBuffer.put(imageByteArrayData); SetImage(myBuffer)//MyNativeMethod in JNI static jobject GetUpdatedImage(JNI

我使用allocateDirect在Java代码中分配了直接内存,并按如下方式填充:

ByteBuffer myBuffer = ByteBuffer.allocateDirect(size);
myBuffer.orger(ByteOrder.nativeOrder());
myBuffer.put(imageByteArrayData);
SetImage(myBuffer)//MyNativeMethod in JNI
static jobject GetUpdatedImage(JNIEnv* env, jobject thiz)
{
gData = gImageProcessor->getProcessedImage();
jobject = (jobject)env->NewDirectByteBufer(gData, sizeofgdata);
return jobject;
}
我有:

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中这个标记的地址和Java中的myBuffer地址(在调试模式下通过变量窗口)时,它们都指向相同的地址

现在,我必须在其他Java模块中获取此图像,该模块与我之前分配了直接缓冲区的Java模块没有任何连接

因此,我在ImageProcessor.cpp中调用了getProcessedImage()方法,它将返回指向JNI的char*指针

我这里的问题是:如何在不进行额外的数组复制的情况下将这些数据返回到Java。我已尝试在JNI中使用NewDirectByteBuffer,如下所示:

ByteBuffer myBuffer = ByteBuffer.allocateDirect(size);
myBuffer.orger(ByteOrder.nativeOrder());
myBuffer.put(imageByteArrayData);
SetImage(myBuffer)//MyNativeMethod in JNI
static jobject GetUpdatedImage(JNIEnv* env, jobject thiz)
{
gData = gImageProcessor->getProcessedImage();
jobject = (jobject)env->NewDirectByteBufer(gData, sizeofgdata);
return jobject;
}
但在Java级别,当我将jobject转换为ByteBuffer时,我可以看到这个对象所表示的地址与.hasarray(),.array()相同,并且对其调用任何方法都会导致不支持的操作异常


我搜索了不同的帖子,但没有得到任何信息。在这方面有人能帮我吗?

直接缓冲区没有相关的支持Java数组,至少在普通JVM中是这样;你不能这样使用它们。如果需要Java数组中的数据,那么一旦获得ByteBuffer get,就可以使用bulk get()操作将字节复制到Java数组中。或者,您可以直接使用ByteBuffer,根据需要使用get/put来读/写数据