我想通过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仍然是空的。
答案 0 :(得分:1)
ByteBuffer是如何创建的?它是direct or non-direct ByteBuffer吗?
如果它是使用allocateDirect
方法在Java中创建的直接ByteBuffer,您可以在本机代码中使用GetDirectBufferAddress
来获取ByteBuffer的直接地址,其中的任何更改都应反映在Java的。