2014-12-07 754 views
1

在功能:Android的JNI:爲什麼ReleaseByteArrayElements不會複製回數據

jint Java_cn_vl_video_Encoder_encode(JNIEnv * env, jobject obj, jlong handle, jbyteArray in, jint in_size, jbyteArray 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有一些正確的數據。 但是在釋放字節數組之後,out在Java中總共爲0。

爲什麼會發生這種情況?

+0

你確定'h264buf'的內容正在被修改嗎? 「vl_video_encoder_encode()」取指針的地址而不是緩衝區的地址似乎有點奇怪。如果它正在一個單獨的緩衝區中工作,然後返回一個更新的指針,則不會看到從Java代碼分配的緩衝區中的任何更改。 (如果是這種情況,你需要自己將'memcpy()'數據寫入字節數組)。 – fadden 2014-12-07 19:44:48

回答

0

當您說'out總共爲0'時,您似乎期待陣列中元素的數量發生奇蹟般的變化。那不是,也不可能,它是如何工作的。請注意,您沒有通過out_sizeReleaseByteArrayElements(),並非您可以,所以它如何知道陣列已更改大小?

+0

ReleaseByteArrayElements()不需要知道數組的大小。 – PTSolmyr 2014-12-07 09:28:27

相關問題