Heim  >  Artikel  >  Java  >  So verwenden Sie den nativen Modifikator in Java

So verwenden Sie den nativen Modifikator in Java

王林
王林nach vorne
2023-04-22 15:46:081796Durchsuche

Verwendung des Native-Modifikators

native wird hauptsächlich für Methoden verwendet

1 Eine native Methode ist eine Schnittstelle für Java zum Aufrufen von Nicht-Java-Code. Eine native Methode bedeutet, dass die Implementierung der Methode in einer Nicht-Java-Sprache wie C oder C++ implementiert ist.

2. Beim Definieren einer nativen Methode wird der Implementierungskörper nicht bereitgestellt (eher wie beim Definieren einer Java-Schnittstelle), da der Implementierungskörper extern von einer Nicht-Java-Sprache implementiert wird.

Erläuterung

Die Java-Sprache selbst kann nicht auf die unterste Ebene des Betriebssystems zugreifen und diese bedienen, sie kann jedoch über die JNI-Schnittstelle andere Sprachen aufrufen, um Zugriff darauf zu erhalten untere Schicht.

JNI ist Java Native Interface, eine native Programmierschnittstelle, die Teil des Java Software Development Kit (SDK) ist. JNI ermöglicht Java-Code die Verwendung von Code und Codebibliotheken, die in anderen Sprachen geschrieben sind.

Mit der Invocation API (Teil von JNI) kann eine Java Virtual Machine (JVM) in eine native Anwendung eingebettet werden, sodass Programmierer Java-Code aus nativem Code heraus aufrufen können.

Beispiel

Nehmen Sie im JDK-Quellcode system.class als Beispiel, da die relevanten Methoden des Betriebssystems aufgerufen werden und die Operation nicht in Java implementiert ist , es wird viele native Modifikationsmethoden geben

So verwenden Sie den nativen Modifikator in Java

Was sind die Verwendungszwecke nativer Modifikationsmethoden

Ich habe mir versehentlich angesehen Ich habe heute den Code gelesen und festgestellt, dass andere dies getan haben. Die Schreibmethode und die mehreren DLL-Dateien im JAR sind ziemlich seltsam. Deshalb habe ich den Code geöffnet und die folgende Schreibmethode gefunden.

public native String GSMModemSMSReadAll(String s, int i);
public native String GSMModemGetErrorMsg(String s);
public native boolean GSMModemIsConn(String s);

Ich fand es ziemlich interessant, habe im Internet nach Informationen gesucht und fand sie gut. Eine andere Methode, Java zum Aufrufen anderer Sprachen zu verwenden (ich wusste es vorher nicht -_#)

Ich habe heute zwei Stunden damit verbracht, einen englischen Artikel darüber zu lesen, was Native Method ist, wie folgt: Das ist Mein Verständnis basiert auf dem Originaltext.

Was ist eine native Methode?

Einfach ausgedrückt ist eine native Methode eine Schnittstelle für Java zum Aufrufen von Nicht-Java-Code. Eine native Methode ist eine Java-Methode, deren Implementierung in einer Nicht-Java-Sprache wie C implementiert ist. Diese Funktion gibt es nicht nur in Java. In C++ können Sie beispielsweise den C++-Compiler anweisen, eine C-Funktion aufzurufen.

"Eine native Methode ist eine Java-Methode, deren Implementierung durch Nicht-Java-Code bereitgestellt wird."

Bei der Definition einer nativen Methode wird Folgendes berücksichtigt: stellt keinen Implementierungskörper bereit (ähnlich wie die Definition einer Java-Schnittstelle), da sein Implementierungskörper extern von Nicht-Java-Sprachen implementiert wird. , ein Beispiel ist unten angegeben:

   public class IHaveNatives
    {undefined
      native public void Native1( int x ) ;
      native static public long Native2() ;
      native synchronized private float Native3( Object o ) ;
      native void Native4( int[] ary ) throws Exception ;
    }

Die Deklarationen dieser Methoden beschreiben, wie einige Nicht-Java-Codes in diesen Java-Codes aussehen (Ansicht).#🎜 🎜#

Der native Bezeichner kann mit allen anderen Java-Bezeichnern außer abstrakt verwendet werden. Dies ist sinnvoll, da „nativ“ impliziert, dass diese Methoden über Implementierungen verfügen. Diese Implementierungen sind jedoch nicht Java, aber „abstrakt“ zeigt deutlich an, dass diese Methoden keine Implementierung haben. Wenn native mit anderen Java-Bezeichnern verwendet wird, unterscheidet sich ihre Bedeutung nicht von der nicht-nativen Methode. Beispielsweise bedeutet native statisch, dass diese Methode direkt aufgerufen werden kann, ohne eine Instanz der Klasse zu generieren Sie möchten eine native Methode verwenden, um eine C-Klassenbibliothek aufzurufen. Die dritte Methode oben verwendet native Synchronisierung. Die JVM führt einen Synchronisierungssperrmechanismus aus, bevor sie in den Implementierungskörper dieser Methode eintritt (genau wie Javas Multithreading).

Eine native Methode kann beliebige Java-Typen zurückgeben. einschließlich Nicht-Basistypen, können auch durch Ausnahmen gesteuert werden. Die Implementierung dieser Methoden kann eine Ausnahme erstellen und auslösen, was den Java-Methoden sehr ähnlich ist. Wenn eine native Methode einige nicht grundlegende Typen wie Object oder ein Integer-Array empfängt, kann die Methode auf die Interna dieser nicht grundlegenden Typen zugreifen. Dadurch wird die native Methode jedoch von der Implementierung der Java-Klasse abhängig, auf die Sie zugreifen. Beachten Sie, dass wir in einer nativen Implementierung einer nativen Methode auf alle Java-Funktionen zugreifen können. Dies hängt jedoch von der Implementierung der Java-Funktionen ab, auf die Sie zugreifen, und ist weitaus schlechter als die Verwendung derjenigen in der Java-Sprache. Die Funktionen sind bequem und einfach.

Das Vorhandensein einer nativen Methode hat keine Auswirkungen auf andere Klassen, die diese nativen Methoden aufrufen. Tatsächlich wissen andere Klassen, die diese Methoden aufrufen, nicht einmal, dass es sich um eine native Methode handelt. Die JVM steuert alle Details des Aufrufs nativer Methoden. Wir müssen auf die Situation achten, wenn wir eine lokale Methode als endgültig deklarieren. In Java implementierte Methodenkörper können durch Inlining beim Kompilieren Effizienzsteigerungen erfahren. Es ist jedoch fraglich, ob eine native endgültige Methode ebenfalls solche Vorteile erzielen kann. Dies ist jedoch nur ein Problem der Codeoptimierung und hat keinen Einfluss auf die funktionale Implementierung.

Wenn eine Klasse geerbt wird, die eine lokale Methode enthält, erbt die Unterklasse die lokale Methode und kann diese Methode in der Java-Sprache überschreiben (dies mag etwas seltsam erscheinen), ähnlich, wenn eine lokale Methode fianl geerbt wird Flag, es kann nach der Vererbung nicht überschrieben werden.

Lokale Methoden sind sehr nützlich, da sie die JVM effektiv erweitern. Tatsächlich hat der von uns geschriebene Java-Code bereits lokale Methoden verwendet. Bei der Implementierung des Java-Parallelitätsmechanismus (Multithreading) gibt es viele Kontakte mit dem Betriebssystem wird an allen Stellen verwendet, was es Java-Programmen ermöglicht, die Grenzen der Java-Laufzeitumgebung zu überschreiten. Mit nativen Methoden kann ein Java-Programm jede Aufgabe auf Anwendungsebene erledigen.

Warum die native Methode verwenden? Java ist sehr praktisch zu verwenden, aber einige Aufgabenebenen sind in Java nicht einfach zu implementieren, oder wenn wir uns große Sorgen um die Effizienz des Programms machen, treten Probleme auf.

Interaktion mit außerhalb der Java-Umgebung:

Manchmal müssen Java-Anwendungen mit der Umgebung außerhalb von Java interagieren. Dies ist der Hauptgrund für die Existenz lokaler Methoden. Sie können sich die Situation vorstellen, in der Java Informationen mit einigen zugrunde liegenden Systemen wie dem Betriebssystem oder einer bestimmten Hardware austauschen muss. Lokale Methoden sind genau ein solcher Kommunikationsmechanismus: Sie stellen uns eine sehr einfache Schnittstelle zur Verfügung und wir müssen die umständlichen Details außerhalb der Java-Anwendung nicht verstehen.

Interaktion mit dem Betriebssystem:

JVM unterstützt die Java-Sprache selbst und die Laufzeitbibliothek. Sie besteht aus einem Interpreter (der Bytecode interpretiert) und einigen Bibliotheken, die mit nativem Code verbunden sind. Es handelt sich jedoch letztlich nicht um ein vollständiges System. Es ist häufig auf die Unterstützung einiger darunterliegender Systeme angewiesen. Bei diesen zugrunde liegenden Systemen handelt es sich häufig um leistungsstarke Betriebssysteme. Durch die Verwendung nativer Methoden können wir Java verwenden, um die Interaktion zwischen jre und dem zugrunde liegenden System zu realisieren. Sogar einige Teile der JVM sind in C geschrieben. Außerdem können wir einige Funktionen des Betriebssystems nutzen, die die Java-Sprache selbst bietet Da wir keine Kapselung bereitstellen, müssen wir auch native Methoden verwenden.

Suns Java:

Suns Interpreter ist in C implementiert, wodurch er wie gewöhnliches C mit der Außenwelt interagiert. Der größte Teil von jre ist in Java implementiert und interagiert auch über einige lokale Methoden mit der Außenwelt. Beispiel: Die Methode setPriority() der Klasse java.lang.Thread ist in Java implementiert, ruft jedoch die lokale Methode setPriority0() in der Klasse auf. Diese native Methode ist in C implementiert und in die JVM implantiert. Auf der Windows 95-Plattform ruft diese native Methode schließlich die Win32-SetPriority()-API auf. Dies ist eine spezifische Implementierung einer lokalen Methode, die direkt von der JVM bereitgestellt wird. Häufiger wird die lokale Methode von einer externen dynamischen Linkbibliothek (externe dynamische Linkbibliothek) bereitgestellt und dann von der JVM aufgerufen. Wie führt JVM die native Methode aus?

Wir wissen, dass bei der ersten Verwendung einer Klasse der Bytecode dieser Klasse in den Speicher geladen und nur einmal zurückgeladen wird. Eine Liste aller Methodendeskriptoren der Klasse wird am Eingang des geladenen Bytecodes geführt. Diese Methodendeskriptoren enthalten folgende Informationen: wo der Methodencode gespeichert ist, welche Parameter er hat und welchen Methodendeskriptor (öffentliche Kategorie) er hat An.

Wenn ein Methodendeskriptor einen nativen enthält, enthält dieser Deskriptorblock einen Zeiger auf die Implementierung der Methode. Diese Implementierungen befinden sich in einigen DLL-Dateien, werden jedoch vom Betriebssystem in den Adressraum des Java-Programms geladen. Wenn eine Klasse mit einer nativen Methode geladen wird, wird die zugehörige DLL nicht geladen, sodass der Zeiger auf die Methodenimplementierung nicht gesetzt wird. Diese DLLs werden erst geladen, wenn die native Methode aufgerufen wird, was durch den Aufruf von java.system.loadLibrary() erreicht wird.

Abschließend ist zu beachten, dass die Verwendung lokaler Methoden mit einem Mehraufwand verbunden ist und viele der Vorteile von Java verloren geht. Wenn wir keine Wahl haben, können wir uns für lokale Methoden entscheiden

Das obige ist der detaillierte Inhalt vonSo verwenden Sie den nativen Modifikator in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen