Übersicht über JNI
Aus Sicht einer JVM gibt es zwei Codetypen: "Java™" und "nativ". Das JNI (Java Native Interface) stellt eine klar strukturierte und plattformunabhängige Schnittstelle zwischen beiden her.
Nativer Code kann zusammen mit Java auf zwei unterschiedliche Arten verwendet werden: als "native Methoden" in einer aktiven JVM und als Code, der eine JVM mithilfe der "Invocation API" erstellt. In diesem Abschnitt wird der Unterschied beschrieben.
Native Methoden
Native Java-Methoden werden in Java deklariert, in einer anderen Sprache (z. B. C oder C + +) implementiert und bei Bedarf von der JVM geladen. Zur Nutzung nativer Methoden müssen Sie folgende Aktionen ausführen:
- Deklarieren Sie die native Methode in Ihrem Java-Code.
Wenn der javac-Compiler eine native Methodendeklaration im Java-Quellcode feststellt, zeichnet er den Namen und die Parameter für die Methode auf. Da der Java-Quellcode keine Implementierung enthält, markiert der Compiler die Methode als "nativ". Die JVM kann dann die Methode bei ihrem Aufruf korrekt auflösen.
- Die native Methode implementieren.
Native Methoden werden als externe Eingangspunkte in einer ladbaren Binärbibliothek implementiert. Der Inhalt einer nativen Bibliothek ist plattformspezifisch. Das JNI ermöglicht der JVM die plattformunabhängige Nutzung von nativen Methoden.
Die JVM ruft die nativen Methoden auf. Wenn sich die JVM in einer nativen Methode befindet, bietet das JNI eine Möglichkeit, die JVM "zurückzurufen".
- Den Code der nativen Methode für die zu verwendende virtuelle Maschine laden.
Sie müssen die native Methode nicht nur deklarieren, sondern auch die native Bibliothek suchen und laden, welche die Methode während der Ausführung enthält.
Zwei Java-Schnittstellen laden native Bibliotheken:
- java.lang.System.load()
- java.lang.System.loadLibrary()
Für gewöhnlich lädt eine Klasse, die native Methoden deklariert, die native Bibliothek in ihren statischen Initialisierungsoperator.
Aufruf-API
Beim Erstellen einer JVM wird nativer Code verwendet. Der Aspekt des JNI, das für diesen Zweck verwendet wird, wird als "JNI-Aufruf-API" bezeichnet. Zur Verwendung der Aufruf-API erstellen Sie entweder statisch oder dynamisch eine Bindung an eine implementierungsspezifische gemeinsam genutzte Bibliothek und rufen die JNI_*-Funktionen auf, die darüber exportiert werden.
JNI-Spezifikation und Implementierung
In der JNI-Spezifikation sind manche Implementierungsdetails nicht sehr ausführlich dargelegt. Sie bietet für einfache und erweiterbare native Schnittstellen in C und C++ ein wiederverwendbares Framework. Außerdem stützt sich die JVMTI-Spezifikation auf das JNI-Modell.
Die Oracle Corporation-Markenspezifikation und das Java Compatibility Kit (JCK) stellen die Einhaltung der Spezifikation sicher, nicht jedoch der Implementierung. Der native Code muss der Spezifikation entsprechen, nicht der Implementierung. Bei einem Code, der für ein nicht spezifiziertes Verhalten geschrieben wurde, sind Probleme im Hinblick auf die Portierbarkeit und Aufwärtskompatibilität wahrscheinlich.