Heim  >  Artikel  >  Java  >  Einführung in die native Java-Methode Native Method

Einführung in die native Java-Methode Native Method

高洛峰
高洛峰Original
2017-02-28 15:48:291131Durchsuche

Detaillierte Einführung in die native Methode von Java

1. 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 der Implementierungstext nicht bereitgestellt ( Manche definieren gerne eine Java-Schnittstelle, weil ihre Implementierung extern von Nicht-Java-Sprachen implementiert wird. Nachfolgend finden Sie ein Beispiel:

 public class IHaveNatives
  {
   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-implementiert, aber „abstrakt“ zeigt deutlich an, dass diese Methoden über keine Implementierung verfügen. 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 Synchronisationssperrmechanismus aus, bevor sie in die Implementierung dieser Methode eintritt (genau wie Javas Multithreading).

Eine native Methode kann beliebige Java-Typen zurückgeben. einschließlich Nicht-Basistypen, können auch zur Ausnahmekontrolle verwendet 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 nativer Methoden hat keine Auswirkungen auf andere Klassen, die diese nativen Methoden aufrufen. Tatsächlich wissen andere Klassen, die diese Methoden aufrufen, nicht einmal, dass sie eine native Methode aufrufen. 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 diese lokale Methode und kann diese Methode in der Java-Sprache überschreiben (das scheint etwas seltsam), das Gleiche gilt für eine lokale Methode. Identifiziert durch Schließlich kann es nach der Vererbung nicht überschrieben werden.
Lokale Methoden sind sehr nützlich, da sie JVM effektiv erweitern. Tatsächlich wurden in dem von uns geschriebenen Java-Code bereits lokale Methoden verwendet. Bei der Implementierung des Java-Parallelitätsmechanismus (Multithreading) beziehen sich viele davon auf den Betrieb System Alle Berührungspunkte verwenden native Methoden, wodurch Java-Programme die Grenzen der Java-Laufzeit überschreiten können. Mit nativen Methoden kann ein Java-Programm jede Aufgabe auf Anwendungsebene erledigen.

2. Warum die native Methode verwenden?

Java ist sehr bequem zu verwenden, aber einige Aufgabenebenen sind in Java nicht einfach zu implementieren, oder wenn uns die Effizienz sehr am Herzen liegt des Programms, hier kommt das Problem.

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:

Die JVM unterstützt die Java-Sprache selbst und die Laufzeitbibliothek. Sie ist die Plattform, auf der Java-Programme basieren. Sie besteht aus einem Interpreter (der Bytecode interpretiert) und einigen Bibliotheken, die mit lokalem Code verbunden sind. Allerdings handelt es sich 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

Der Interpreter von Sun ist in C implementiert, was ihm ermöglicht, wie normales C mit der Außenwelt zu interagieren. 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.

3. Wie führt JVM die native Methode aus:

Wir wissen, dass der Bytecode dieser Klasse in den Speicher geladen wird, wenn sie zum ersten Mal verwendet wird wird nur einmal geladen. 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 lokale Methoden verwenden.

Vielen Dank fürs Lesen, ich hoffe, es kann Ihnen helfen, vielen Dank für Ihre Unterstützung dieser Website!

Weitere Artikel zur Einführung der Java Native Method finden Sie auf der chinesischen PHP-Website!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn