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

标签 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仍然是空的。

最佳答案

ByteBuffer 是如何创建的?是direct or non-direct吗字节缓冲区?

如果它是在 Java 中使用 allocateDirect 方法创建的直接 ByteBuffer,您可以在 native 代码中使用 GetDirectBufferAddress 来获取 ByteBuffer 的直接地址和任何那里的更改应该反射(reflect)在 Java 中。

关于android - 如何在 JNI 中将 char[] 转换为 ByteBuffer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9477821/

相关文章:

java - ByteBuffer 与 ChannelBuffer

android - 在 Android SQLite 数据库中存储值的最快方法?

java - 使用用户名引用将数据保存到 Firebase

android - 链接 OpenCV 库的顺序是什么?

java - 使用 JNI 时出现问题 - 生成头文件时出错

c++ - 将 std::string 转换为使用 windows-1256 编码的 jstring

java.nio.ByteBuffer.slice() 线程行为?

java - 如何使用字节缓冲区序列化字节数组以开始遵循 Big Endian 格式?

android - 使用 RenderScript 将 YUV NV12 转换为 RGB

java - 取消异步任务的最佳方法