gpt4 book ai didi

java-native-interface - 使用 NewDirectByteBufer() 创建的 ByteBuffer 中没有数组

转载 作者:行者123 更新时间:2023-12-02 05:07:40 25 4
gpt4 key购买 nike

我是 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 中检查此标记的地址和 Java 中的 myBuffer 地址(通过 Debug模式下的变量窗口)时,两者都指向相同的地址。

现在我必须在其他一些 Java 模块中取回此图像,这与我之前分配了直接缓冲区的 Java 模块没有任何联系。

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

我的问题是:如何在不进行额外数组复制的情况下将此数据返回给 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。

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

最佳答案

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

关于java-native-interface - 使用 NewDirectByteBufer() 创建的 ByteBuffer 中没有数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9337715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com