2016-08-03 29 views
0

充分利用JNI通過CheckJNI以下異常。JNI例外:jarray是一個無效的全球參考

JNI DETECTED ERROR IN APPLICATION: jarray is an invalid global reference: 0x8f635e1e (0xdead4321) 

偏偏期間:

uint32_t* indexes = ConvertIntArray(env, cls, planeLengths); 

它是:

jlong Java_<censored>(JNIEnv *env, jclass cls, jlong state, jintArray planeLengths) 

一切都發生上面的功能,所以沒有全球性的參考文獻中

uint32_t* ConvertIntArray(JNIEnv *env, jclass cls, jintArray intArray) 
{ 
    return (*env)->GetIntArrayElements(env, intArray, NULL); 
} 

這是從所謂的製成。 planeLengths直接傳遞給ConvertIntArray,它應該返回它的uint32指針。 Google也沒有JNI錯誤的結果。

注:以上線路是所有的C預處理完成後。有幾個宏可以替代不同的代碼,這就是爲什麼ConvertIntArray函數似乎毫無意義。

我的同事和我都難倒。有什麼想法嗎?

+0

哪裏'planeIndexes'從何而來?你的JNI函數接收一個'jintArray',但是那個被稱爲'planeLengths'。 – Michael

+0

我的不好。我截斷了大部分的論點,但是把錯誤的論點留在後面。 –

+0

我會說你有其他地方的內存損壞。 – EJP

回答

0

所以,事實證明這是一個內存破壞。在這個問題中,我截短了幾個長參數來縮短問題的長度。事實證明,Java傳入的是整數,而不是長度較小的變量,將一些指針移回。所以,它基本上破壞了工作。