Frage

ich mit dem Android NDK gerade anfing zu arbeiten, aber ich erhalte immer SIGSEGV, wenn ich diesen Anruf habe in meinem C-Code:

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

Base auf alle Beispiel die ich finden kann, ist der obige Code korrekt, aber ich erhalte immer SIGSERGV und alles ist in Ordnung, wenn die NewObjectArray Linie geführt wird kommentiert. Jede Idee, was könnte dazu führen, ein solches Problem?

War es hilfreich?

Lösung

Das sieht richtig, so dass ich Sie bin zu raten falsch etwas anderes getan haben. Ich gehe davon aus Sie laufen mit checkjni auf? Sie könnte, dass in mehrere Zeilen bis brechen wollen. das Findclass tun und den Rückgabewert überprüfen, führen Sie die NewStringUTF und überprüfen Sie den Rückgabewert, und dann NewObjectArray rufen

btw, können Sie NULL als letztes Argument zu übergeben; dieses Muster von dem leeren String als Standardwert für jedes Element des Arrays verwendet wird häufig verwendet (i es Kopie denken und von einer Sun-Dokumentation eingefügt und hat Ausbreitung von dort), aber es ist selten sinnvoll, und es ist etwas verschwenderisch. (Und es entspricht nicht das Verhalten von "new String [10]" in Java).

Andere Tipps

ich denke, eine der möglichen Ursachen ist, dass in einem langfristigen JNI-Methode, bricht die VM ausgeführt wird, wenn aus den per-Verfahren-Aufruf lokalen Referenzschlitze (normalerweise 512 Schlitze in Android).

Da Findclass () und NewStringUTF () -Funktionen lokale Referenzen zuweisen würde, wenn Sie für eine lange Zeit in einer JNI-Methode bleiben, die VM nicht wissen, ob eine bestimmte lokale Referenz zurückgeführt werden soll oder nicht. Sie müssen also explizit DeleteLocalRef () freizugeben, die erworbenen lokalen Referenzen nennen sollten, wenn sie nicht mehr benötigt. Wenn Sie dies nicht tun, werden die „Zombie“ lokale Referenzen Schlitze in VM besetzen, und die VM bricht während aller Slots Ortsollwert läuft aus.

Kurz geführten JNI-Methode, kann dies kein Problem wegen der vielen lokalen Bezügen würde recycelt werden, wenn sie von einer JNI-Methode verlassen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top