2011-08-01 55 views
0

我在java中創建一個字節數組並通過引用jni函數來傳遞它。這是我在一個循環中執行的,並且有時會在jni中出現內存不足錯誤。我想知道如果java在每次迭代時自動釋放數組,或者因爲它傳遞給jni函數,它不會?從內存中釋放jni引用

JNI代碼(bOldArray是java字節數組我傳遞給JNI作爲參數)

len = (*env)->GetArrayLength(env,bOldArray); 
char *oldBuff = (char *)calloc(sizeof(char),MAX_SIZE); 
jbyte* bytes = (*env)->GetByteArrayElements(env,bOldArray,0); 
memcpy(oldBuff,bytes,len); 
(*env)->ReleaseByteArrayElements(env,bOldArray,(jbyte *)bytes,0); 
+0

在此的任何更新的共享/靜態緩衝器? – jogabonito

+0

仍然無法找到錯誤。 – VBK

回答

0

如果您正在使用GetByteArrayElements你必須調用ReleaseByteArrayElements您正在使用JNI數組完成後,因爲JVM將阻止在Java中釋放此數組,直到您這樣做。 請張貼代碼即可獲得一個清晰的概念

+0

添加了所需的代碼。 – VBK

+0

看起來好像java數組的發佈沒有問題。幾條建議。你可以使用len而不是MAX_SIZE來調用calloc。另外,如果在一個循環中調用這個函數,你將不得不在一些點 – jogabonito

+0

處釋放oldBuff,這要感謝這個建議。是的,我在返回jni之前解放了oldBuff。 – VBK

2

你有2個緩衝區這裏,一個從您的Java代碼(bOldArray),哪些是你在第2行

其實

分配的本地緩存(oldbuff)手,你可能有更多的緩衝區,因爲

(*env)->GetArrayLength 

幾乎肯定使內存的不可移動的複印件(需要C-指針訪問),它保存在數組中你的Java代碼,並與

(*env)->ReleaseByteArrayElements(env,bOldArray,(jbyte *)bytes,0); 

此內存複製回你的java數組的內存(檢查ReleaseByteArrayElements的最後一個參數的文件)

但關於你的問題:你應該釋放oldBuff了。

free(oldBuff); 

其他虛擬機確實的Java數組的自由你的c-副本,但不是直接的自我分配部分(它可能做THIZ後來因對象的壽命和垃圾回收,但這是不可預知的,因此,外的存儲器錯誤是不可預測的也)

避免了Java-C-複製機制(加速性能)使用像的ByteBuffer