如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 vc++ 中将 char* 转换为 LPWSTR..........................? [复制]