如何在 JNI 中将 char[] 转换为 ByteBuffer?

Posted

技术标签:

【中文标题】如何在 JNI 中将 char[] 转换为 ByteBuffer?【英文标题】:How to convert char[] to ByteBuffer in JNI? 【发布时间】:2012-02-28 07:12:30 【问题描述】:

我想通过 JNI 将 ByteBuffer 传递给 C++,作为接收从 AVDecode 解码的图像的缓冲区,尽管缓冲区已正确填充 C++,但 Java 端的 ByteBuffer 仍然是空的。 请帮我找出错误在哪里。谢谢。 pOutBuffer 是通过 JNI 传递的 ByteBuffer。

jclass ByteBufferClass = env->GetObjectClass(pOutBuffer);  
jmethodID ArraryMethodId = env->GetMethodID(ByteBufferClass,"array","()[B");  
jmethodID ClearMethodId = env->GetMethodID(ByteBufferClass,"clear","()Ljava/nio/Buffer;");  

//clear buffer  
env->CallObjectMethod(pOutBuffer,ClearMethodId);  

jbyteArray OutByteArrary = (jbyteArray)env->CallObjectMethod(pOutBuffer,ArraryMethodId);  
jbyte OutJbyte = env->GetByteArrayElements(OutByteArrary,0);  

Out = (unsigned char*)OutJbyte;
DecodeSize = AVDecode(m_pVideoDecode, (unsigned char *)In, inputSize, (unsigned char **)&Out, (int *)&pBFrameKey);

解码是正确的,我可以看到'Out'被输出图像填充,但是当这个函数返回时,Java端的pOutBuffer仍然是空的。

【问题讨论】:

【参考方案1】:

ByteBuffer 是如何创建的?是direct or non-directByteBuffer 吗?

如果它是在 Java 中使用 allocateDirect 方法创建的直接 ByteBuffer,您可以在您的本机代码中使用 GetDirectBufferAddress 来获取 ByteBuffer 的直接地址,并且那里的任何更改都应该反映在 Java 中。

【讨论】:

我尝试使用 allocateDirect() 并使用 GetDirectBufferAddress() 的方法,但它仍然是空的,现在我想知道它是否是使用 allocate 在 Java 中创建的 ByteBuffer,我应该是使用哪种方法?谢谢。

以上是关于如何在 JNI 中将 char[] 转换为 ByteBuffer?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中将字符串转换为 char 数组?

如何在 vc++ 中将 char* 转换为 LPWSTR..........................? [复制]

如何在C中将char转换为整数? [复制]

如何使用“ord”函数在 Haskell 中将 Char 转换为 Int?

如何在 VC++ 中将 char* 转换为 LPWSTR?

如何在 C 中将 void 指针转换为 char 指针