2016-08-03 64 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传入的是整数,而不是长度较小的变量,将一些指针移回。所以,它基本上破坏了工作。