Debugging des Java Native Interface (JNI)

Wenn Sie ein JNI-Problem vermuten, können Sie bestimmte Prüfungen ausführen, die für die Diagnose der JNI-Übergänge hilfreich sind.

Fehler im JNI-Code können auf mehrere Arten auftreten:
  • Das Programm stürzt während der Ausführung einer nativen Methode ab (sehr häufig auftretendes Problem).
  • Das Programm stürzt einige Zeit, nachdem es von der nativen Methode zurückgekehrt ist, ab. Dies kommt vorwiegend während eines Grafikkontexts vor (nicht sehr häufig auftretendes Problem).
  • Fehlerhafter JNI-Code führt zu Deadlock kurz nach der Rückkehr aus einer nativen Methode (gelegentlich auftretendes Problem).

Wenn Sie ein Problem bei der Interaktion zwischen benutzerdefiniertem nativen Code und der JVM vermuten (also ein JNI-Problem), können Sie bestimmte Prüfungen ausführen, die für die Diagnose der JNI-Übergänge hilfreich sind. Zur Ausführung dieser Prüfungen müssen Sie beim Start der JVM die Option -Xcheck:jni angeben.

Die Option -Xcheck:jni aktiviert eine Reihe von Wrapper-Funktionen rund um die JNI-Funktionen. Die Wrapper-Funktionen führen Prüfungen bei den eingehenden Parametern durch. Bei diesen Prüfungen werden unter anderem folgende Punkte untersucht:
  • Ob sich dieser Aufruf und der Aufruf, durch den das JNI initialisiert wurde, in demselben Thread befinden.
  • Ob die Objektparameter gültige Objekte sind.
  • Ob lokale oder globale Verweise auf gültige Objekte verweisen.
  • Gibt an, ob der Typ eines Felds mit dem Aufruf Get<Type>Field oder Set<Type>Field übereinstimmt.
  • Ob statische und nicht statische Feld-IDs gültig sind.
  • Ob Zeichenfolgen gültig und ungleich null sind.
  • Ob Array-Elemente ungleich null sind.
  • Die Array-Elementtypen.

Die Ausgabe von -Xcheck:jni wird im Standardfehlerdatenstrom angezeigt und hat ungefähr folgenden Wortlaut:

JVMJNCK059W: JNI warning in FindClass: argument #2 is a malformed identifier ("invalid.name")
JVMJNCK090W: Warning detected in com/ibm/examples/JNIExample.nativeMethod() [Ljava/lang/String];
Die erste Zeile gibt Aufschluss über folgende Punkte:
  • Die Fehlerkategorie (Fehler, Warnung oder Empfehlung).
  • Die JNI-API, in welcher der Fehler festgestellt wurde.
  • Eine Erläuterung des Problems.
Die letzte Zeile gibt die native Methode an, die ausgeführt wurde, als der Fehler festgestellt wurde.

Sie können zusätzliche Unteroptionen angeben, indem Sie -Xcheck:jni:<suboption>[,<...>]verwenden. Folgende Unteroptionen sind hilfreich:

all
Anwendungs- und Systemklassen prüfen.
verbose
Trace für bestimmte JNI-Funktionen und -Vorgänge durchführen.
trace
Trace für alle JNI-Funktionen durchführen.
nobounds
Keine Grenzprüfungen für Zeichenfolgen und Arrays durchführen.
nonfatal
Bei Erkennung von Fehlern nicht beenden.
nowarn
Warnungen nicht anzeigen.
noadvice
Empfehlungen nicht anzeigen.
novalist
Nicht auf va_list-Wiederverwendung prüfen (siehe Hinweis unten in diesem Abschnitt).
pedantic
Gründlichere, aber langsamere Prüfungen ausführen.
valist
Auf Wiederverwendung von 'va_list' prüfen (siehe Hinweis unten in diesem Abschnitt).
help
Hilfetext ausgeben.

Die Option -Xcheck:jni kann sich negativ auf die Leistung auswirken, da sie bei der Überprüfung der bereitgestellten Parameter sehr gründlich vorgeht.

Hinweis:

Bei einigen Plattformen führt die Wiederverwendung einer 'va_list' in einem zweiten JNI-Aufruf (wenn CallStaticVoidMethod() beispielsweise zweimal mit denselben Argumenten aufgerufen wird) dazu, dass die va_list beschädigt wird und der zweite Aufruf fehlschlägt. Wenn Sie sicherstellen möchten, dass die va_list nicht beschädigt wird, verwenden Sie das C-Standardmakro va_copy() im ersten Aufruf. Standardmäßig sorgt -Xcheck:jni dafür, dass eine va_list nicht wiederverwendet wird. Inaktivieren Sie diese Prüfung nur dann mit der Unteroption novalist, wenn Ihre Plattform die Wiederverwendung einer va_list ohne va_copy zulässt. z/OS® -Plattformen ermöglichen die Wiederverwendung von va_list und standardmäßig wird -Xcheck:jni:novalist verwendet. Verwenden Sie zum Aktivieren der va_list -Wiederverwendungsprüfung die Option -Xcheck:jni:valist .