我想通过 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仍然是空的。
最佳答案
ByteBuffer 是如何创建的?是direct or non-direct吗字节缓冲区?
如果它是在 Java 中使用 allocateDirect
方法创建的直接 ByteBuffer,您可以在 native 代码中使用 GetDirectBufferAddress
来获取 ByteBuffer 的直接地址和任何那里的更改应该反射(reflect)在 Java 中。
关于android - 如何在 JNI 中将 char[] 转换为 ByteBuffer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9477821/