2010-01-21 95 views
5

我剛開始與Android NDK工作,但我不斷收到SIGSEGV當我有這個電話在我的C代碼:在Android中爲JNI調用NewObjectArray時會導致SIGSEGV的什麼情況?

jobjectArray someStringArray; 
someStringArray = (*env)->NewObjectArray(env, 10, 
(*env)->FindClass(env,"java/lang/String"),(*env)->NewStringUTF(env, "")); 

此基礎上所有我能找到的例子,上面的代碼是正確的,但我不斷收到如果NewObjectArray行被註釋掉,SIGSERGV和一切正常。任何想法可能會導致這樣的問題?

+0

忘了提及,我正在使用NDK1.6 – Ken 2010-01-21 22:05:31

回答

4

看起來是正確的,所以我猜你已經做了一些其他的錯誤。我假設你用checkjni運行?你可能想把它分成多行:執行FindClass並檢查返回值,執行NewStringUTF並檢查返回值,然後調用NewObjectArray。

btw,你可能想傳遞NULL作爲最後一個參數;這種使用空字符串作爲數組中每個元素的默認值的模式是常用的(我認爲它是從一些Sun文檔粘貼的並且從那裏傳播的副本&),但它很少有用,而且有點浪費。 (並且它與Java中的「new String [10]」的行爲不匹配。)

2

我猜其中一個可能的原因是,在長時間運行的JNI方法中,VM在用完每個方法調用本地參考插槽(通常是Android中的512個插槽)。

由於FindClass()和NewStringUTF()函數會分配本地引用,如果您長時間停留在JNI方法中,VM不知道是否應回收特定的本地引用。所以你應該明確調用DeleteLocalRef()來釋放不再需要的獲取本地引用。如果不這樣做,「殭屍」本地引用將佔用虛擬機中的插槽,虛擬機在所有本地參考插槽耗盡時中止。

在短期運行的JNI方法中,這可能不是問題,因爲所有本地引用在從JNI方法中退出時都會被回收。

相關問題