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

时间:2012-02-28 07:12:30

标签: android java-native-interface bytebuffer

我想通过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 个答案:

答案 0 :(得分:1)

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

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