使用NewDirectByteBufer()创建的ByteBuffer中没有数组

时间:2012-02-18 01:32:50

标签: java-native-interface

我是JNI的新手,我需要使用DirectBuffers将批量映像数据从Java传输到C ++,然后再从C ++传输到Java。

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

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

AtJni我做:

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()方法,它将char *指针返回给JNI。

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

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 :(得分:0)

直接缓冲区没有关联的后备Java数组,至少在常见的JVM中是这样;你不能这样使用它们。如果需要Java数组中的数据,一旦获得ByteBuffer get,就可以使用批量get()操作将字节复制到Java数组中。或者,您可以直接使用ByteBuffer,使用get / put来读取/写入数据。

相关问题