Detaillierte Einführung in den Registrierungsprozess der Java JNI -Funktion
Wenn wir native Code in Java anrufen, wird er im Allgemeinen über JNI implementiert. Wir müssen die lokale .so -Bibliotheksdatei nur in der Java -Klasse laden, die native Methode deklarieren und sie dann dort aufrufen, wo sie aufgerufen werden muss. Für die spezifische Implementierung der nativen Methode in Java wird alles an die native Schicht übergeben. Was ist die Voraussetzung für uns, die entsprechenden Funktionen im lokalen Code in Java korrekt aufzurufen? Die Antwort besteht darin, eine Eins-zu-Eins-Korrespondenz zwischen nativen Methoden in Java und Funktionen im lokalen Code durch bestimmte Mechanismen festzulegen. Was ist dieser Mechanismus? Es ist der Registrierungsmechanismus der JNI -Funktionen.
Es gibt zwei Möglichkeiten, JNI -Funktionen zu registrieren, eine ist die statische Registrierungsmethode und die andere die dynamische Registrierungsmethode. Lassen Sie uns diese beiden Implementierungsmethoden unten vorstellen.
1. Statische Registrierung.
1. Implementierungsprinzip: Erstellen Sie eine Eins-zu-Eins-Korrespondenz zwischen einer Java-Methode und einer JNI-Funktion basierend auf dem Funktionsnamen.
2. Implementierungsprozess:
①Riting Java Code;
② Java -Code kompilieren und .Class -Dateien generieren;
③ Verwenden Sie die Javah -Direktive, um die JNI -.H -Datei mit der generierten .class -Datei zu generieren.
④ Die generierte JNI -Header -Datei enthält die Deklaration der Java -Funktionen in der JNI -Schicht;
3. Nachteile:
①Writing ist sehr unpraktisch, da die Namen der JNI -Schichtfunktionen einem bestimmten Format folgen müssen und die Namen besonders lang sind.
② Es wird viel Arbeit für Programmierer verursachen, da JNI -Header -Dateien für alle Java -Klassen geschrieben werden müssen, die native Funktionen deklarieren.
③Das Programm wird ineffizient ausgeführt, da Sie beim ersten Aufrufen einer nativen Funktion zum ersten Mal nach der entsprechenden lokalen Funktion in der JNI -Ebene nach dem Funktionsnamen suchen und dann eine entsprechende Beziehung herstellen müssen. Dieser Prozess ist zeitaufwändig.
2. Dynamische Registrierung.
1. Implementierungsprinzip: Ermitteln Sie der nativen Funktion direkt auf die entsprechende Funktion in JNI.
2. Implementierungsprozess:
① Verwenden Sie die Struktur Jninativemethod, um die Korrespondenz zwischen Java -nativen Funktionen und JNI -Funktionen zu retten.
② Speichern Sie die Korrespondenz zwischen allen nativen Funktionen und JNI -Funktionen in einem Jninativemethod -Array;
③ Nach dem Laden der JNI -dynamischen Bibliothek über System.loadlibrary In Java rufen Sie die Funktion JNI_onload auf und starten Sie die dynamische Registrierung.
④Die AndroidRuntime :: RegisterNativemethods -Funktion wird in jni_onload für die Funktionsregistrierung aufgerufen.
⑤Die letzter Anruf bei Jniregisternativemethods in AndroidRuntime :: RegisterNativemethods Vollständige Registrierung.
3. Vorteile: Überwindung der Nachteile der statischen Registrierung.
Danke fürs Lesen, ich hoffe, es kann Ihnen helfen. Vielen Dank für Ihre Unterstützung für diese Seite!