是否可以在JNI中引用整個字節數組而不調用任何副本?如何在JNI中讀取bytearray?
在原生的C代碼,我有一個字節組從Java傳球,我只是想將一些數據比較,此ByteArray所以我不想做任何內存拷貝。可能嗎 ?
我知道我可以通過使用GetPrimitiveArrayCritical類似的東西
JNIEXPORT jbyteArray JNICALL Java_nfore_android_bt_pro_nfhfp_dsp
(JNIEnv *env, jobject jobj, jbyteArray jbIn, jbyteArray jbBase){
jbyte *bufferIn;
jbyte *bufferBase;
bufferIn = (*env)->GetPrimitiveArrayCritical(env, jbIn, NULL);
LOGD("Begin of dsp()");
LOGD("In dsp() Before Comparing...");
// Compare bufferIn with bufferBase here...
LOGD("In dsp() After Comparing...");
LOGD("End of dsp()");
(*env)->ReleasePrimitiveArrayCritical(env, jbIn, bufferIn, 0);
return jbIn;
}
正如你可以看到,因爲我可能會改變在jbIn數據獲得原生的ByteArray的指針,我應該用GetPrimitiveArrayCritical獲得它的指針並在稍後釋放它。
但是,如果我只是想讀的ByteArray jbBase,我怎麼可能讓jbBase的指針,但沒有使用GetPrimitiveArrayCritical?
任何建議,將不勝感激。非常感謝。
謝謝你的回覆,吉姆。通過規格指南,GetByteArrayElements仍然可能會複製,對吧?此外,GetByteArrayElements將獨佔模式設置爲這個bytearray?如果我還需要同時讀取其他線程中的這個bytearray,它會發生衝突嗎?謝謝。 –
它不設置獨佔模式,但如果您只讀數組,那麼併發訪問應該是OK。如果它可以同時寫入,那麼您將需要使用互斥鎖或同步。我不知道它是否做了副本,據我可以告訴它只是返回一個指向數組的指針,我使用它作爲高性能編解碼器,我從來沒有注意到它複製數組,雖然它很難說如果它做了一個副本。 –
好的,我明白了。謝謝你的幫助吉姆。 –