2016-08-03 7 views
0

CheckJNI経由でJNIから次の例外を取得しています。JNI例外:jarrayは無効なグローバル参照です

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

すべてがそれほどないグローバル参照上記関数内で行わ:である

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

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

から呼び出される:

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

が中に発生します作られています。 planeLengthsは直接ConvertIntArrayに渡され、そのポインタはuint32ポインタを返すべきです。 GoogleはJNIエラーの結果も表示していません。

注:上記の行は、すべてのC前処理が完了した後のものです。異なるコードで置き換えられるいくつかのマクロがあります。その理由は、ConvertIntArray関数が無意味に見える理由です。

私の仲間と自分自身が困惑しています。何かご意見は?

+0

'planeIndexes 'はどこから来たのですか?あなたのJNI関数は 'jintArray'を受け取りますが、それは' planeLengths'と呼ばれます。 – Michael

+0

私の悪い。私は議論のほとんどを切り捨てましたが、間違ったものを残しました。 –

+0

私はあなたがどこか他の場所でメモリ破損していると言います。 – EJP

答えて

0

だから、メモリ破損であることが判明しました。質問では、問題をより短くするために、長いパラメータのいくつかを切り捨てました。それが判明したとき、Javaはlong型ではなくint型で渡していました。これは小さな変数で、ポインタの一部を元に戻しました。だから、それは基本的にjobjectsを壊した。