2016-08-03 34 views
0

Erhalte die folgende Ausnahme von JNI über CheckJNI.JNI-Ausnahme: jarray ist eine ungültige globale Referenz

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

geschieht während:

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

, die aus aufgerufen:

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

, die ist:

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

Alles geschieht innerhalb der oben genannten Funktion, so dass keine globalen Referenzen werden hergestellt. planeLengths wird direkt in ConvertIntArray übergeben, das den uint32-Zeiger zurückgeben soll. Google hat auch keine Ergebnisse zum JNI-Fehler.

Hinweis: Die obigen Zeilen sind nach der C Vorverarbeitung erfolgt. Es gibt mehrere Makros, die in verschiedenen Code ersetzen, weshalb die ConvertIntArray-Funktion sinnlos scheint.

Mein Kollege und ich sind ratlos. Irgendwelche Gedanken?

+0

Woher kommt 'planeIndexes'? Ihre JNI-Funktion empfängt ein 'jintArray', das heißt jedoch 'planeLengths'. – Michael

+0

Mein schlechtes. Ich habe die meisten Argumente gekürzt, aber den falschen zurückgelassen. –

+0

Ich würde sagen, Sie haben eine Speicherbeschädigung woanders. – EJP

Antwort

0

So stellt sich heraus, es war eine Speicherbeschädigung. In der Frage habe ich einige der langen Parameter abgeschnitten, um die Frage zu verkürzen. Wie sich herausstellte, übergab Java statt Longs Ints, die als kleinere Variablen einige Zeiger zurückführten. Also, es korrumpierte im Grunde die Projekte.