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()
将数据放入字节数组。)