Java Android JNI:为什么ReleaseByteArrayElements不复制回数据
在功能上:Java Android JNI:为什么ReleaseByteArrayElements不复制回数据,java,android-ndk,java-native-interface,Java,Android Ndk,Java Native Interface,在功能上: jint Java_cn_vl_video_Encoder_encode(JNIEnv * env, jobject obj, jlong handle, jbyteArray in, jint in_size, jbyteArray out) out是Java中的字节数组 有些代码如下所示: char * h264Buf = (char*) (*env)->GetByteArrayElements(env, out, &h264Buf_isCopy); jint o
jint Java_cn_vl_video_Encoder_encode(JNIEnv * env, jobject obj, jlong handle, jbyteArray in, jint in_size, jbyteArray out)
out是Java中的字节数组
有些代码如下所示:
char * h264Buf = (char*) (*env)->GetByteArrayElements(env, out, &h264Buf_isCopy);
jint out_size = vl_video_encoder_encode(handle_t, FRAME_TYPE_AUTO, buf, in_size, &h264Buf);
(*env)->ReleaseByteArrayElements(env, out, (jbyte*)h264Buf, 0);
我已经打印了一些登录jni的代码,h264Buf有一些正确的数据。
但在发布字节数组之后,在Java中out的总数为0
为什么会发生这种情况 当你说“
out
is total 0”时,你似乎期望数组中的元素数量会发生神奇的变化。这不是,也不可能是,它的工作原理。请注意,您没有将输出\u size
传递给ReleaseByteArrayElements()
,这不是您可以传递的,因此它如何知道数组大小已更改 ReleaseByteArrayElements()不需要知道数组的大小。是否确实正在修改h264buf
的内容?似乎有点奇怪,vl\u video\u encoder\u encode()
采用的是指针的地址,而不是缓冲区的地址。如果它在一个单独的缓冲区中工作,然后返回一个更新的指针,那么在Java代码分配的缓冲区中不会看到任何更改。(如果是这种情况,您需要自己memcpy()
将数据放入字节数组。)