Beim Spielen dieses Puzzles (es ist ein Java-Keyword-Quizspiel) bin ich auf das native
Keyword gestoßen.
Wofür wird das native Schlüsselwort in Java verwendet?
java
java-native-interface
native
keyword
Wirbel
quelle
quelle
Antworten:
Das
native
Schlüsselwort wird auf eine Methode angewendet, um anzugeben, dass die Methode mithilfe von JNI (Java Native Interface) in nativem Code implementiert ist.quelle
Minimal lauffähiges Beispiel
Main.java
Haupt c
Kompilieren und ausführen:
Ausgabe:
Getestet unter Ubuntu 14.04 AMD64. Funktionierte auch mit Oracle JDK 1.8.0_45.
Beispiel auf GitHub, mit dem Sie spielen können.
Unterstriche in Java-Paket- / Dateinamen müssen
_1
im C-Funktionsnamen maskiert werden, wie unter: Aufrufen von JNI-Funktionen im Android-Paketnamen mit UnterstrichDeutung
native
erlaubt dir zu:Dies könnte verwendet werden, um:
mit dem Kompromiss einer geringeren Portabilität.
Sie können Java auch von C aus aufrufen, müssen jedoch zuerst eine JVM in C erstellen: Wie rufe Java-Funktionen von C ++ auf?
Analoge native Erweiterungs-APIs sind aus den gleichen Gründen auch in vielen anderen "VM-Sprachen" vorhanden, z. B. Python , Node.js , Ruby .
Android NDK
Das Konzept ist in diesem Zusammenhang genau das gleiche, außer dass Sie Android Boilerplate verwenden müssen, um es einzurichten.
Das offizielle NDK-Repository enthält "kanonische" Beispiele wie die Hallo-JNI-App:
In
unzip
einem.apk
mit NDK auf Android O können Sie den vorkompilierten.so
Code sehen, der dem nativen Code unter entsprichtlib/arm64-v8a/libnative-lib.so
.TODO bestätigen: Außerdem handelt
file /data/app/com.android.appname-*/oat/arm64/base.odex
es sich um eine gemeinsam genutzte Bibliothek, bei der es sich meiner Meinung nach um die vorkompilierte AOT-.dex handelt, die den Java-Dateien in ART entspricht. Siehe auch: Was sind ODEX-Dateien in Android? Vielleicht wird Java tatsächlich auch über a ausgeführtnative
Schnittstelle ausgeführt?Beispiel im OpenJDK 8
Lassen Sie uns finden, wo
Object#clone
in jdk8u60-b27 definiert ist.Wir werden daraus schließen, dass es mit a implementiert wird
native
Aufruf umgesetzt wird.Zuerst finden wir:
was uns zu jdk / src / share / classes / java / lang / Object.java # l212 führt :
Jetzt kommt der schwierige Teil, herauszufinden, wo sich der Klon inmitten aller Indirektion befindet. Die Frage, die mir geholfen hat, war:
Hier werden entweder C- oder C ++ - Dateien gefunden, die die nativen Methoden von Object implementieren könnten. Es führt uns zu jdk / share / native / java / lang / Object.c # l47 :
was uns zum
JVM_Clone
Symbol führt:was uns zu hotspot / src / share / vm / prims / jvm.cpp # l580 führt :
Nachdem wir eine Reihe von Makros erweitert haben, kommen wir zu dem Schluss, dass dies der Definitionspunkt ist.
quelle
static
native
Java-Methode ist der zweite Parameter der C ++ - Funktion vom Typjclass
und nicht vom Typjobject
.Es markiert eine Methode, die in anderen Sprachen implementiert wird, nicht in Java. Es funktioniert zusammen mit JNI (Java Native Interface).
In der Vergangenheit wurden native Methoden verwendet, um leistungskritische Abschnitte zu schreiben. Da Java jedoch immer schneller wird, ist dies jetzt weniger verbreitet. Native Methoden werden derzeit benötigt, wenn
Sie müssen eine Bibliothek aus Java aufrufen, die in einer anderen Sprache geschrieben ist.
Sie müssen auf System- oder Hardwareressourcen zugreifen, die nur von der anderen Sprache aus erreichbar sind (normalerweise C). Tatsächlich können viele Systemfunktionen, die mit einem realen Computer interagieren (z. B. Festplatten- und Netzwerk-E / A), dies nur, weil sie nativen Code aufrufen.
Siehe auch Java Native Interface-Spezifikation
quelle
currentTimeMillis
sind Teil des JDK und werden mit Anmerkungen versehen,native
da sich die Implementierung im JDK-Quellcode selbst befindet. Es ist sehr unwahrscheinlich, dass die Implementierung Assemblersprache verwendet. Es ruft wahrscheinlich eine API-Methode des Betriebssystems auf, auf dem die JVM ausgeführt wird. Unter Windows kann beispielsweise eine DLL-MethodeGetSystemTime
in kernel32.dll aufgerufen werden . Auf einem anderen Betriebssystem wird es eine andere Implementierung haben. Wenn Sie jedochnative
für eine Methode verwenden, die Sie schreiben (im Gegensatz zu einer JDK-Methode), müssen Sie die Implementierung mithilfe von JNI bereitstellen.currentTimeMillis
ist in als nativ markiertjava.lang.System
, verwendet also JNI, stimmt das nicht?Direkt aus der Java-Sprachspezifikation :
quelle
Wie SLaks antwortete, dient das
native
Schlüsselwort zum Aufrufen von nativem Code.Es wird auch von GWT zur Implementierung von Javascript-Methoden verwendet.
quelle
Funktionen, die nativen Code implementieren, werden als nativ deklariert.
http://en.wikipedia.org/wiki/Java_Native_Interface
quelle
NATIVE ist kein Zugriffsmodifikator. Es kann nur auf METHOD angewendet werden. Es zeigt die PLATFORM-ABHÄNGIGE Implementierung der Methode oder des Codes an.
quelle
native ist ein Schlüsselwort in Java, das verwendet wird, um nicht implementierte Strukturen (Methoden) wie abstrakt zu machen, aber es wäre plattformabhängig wie nativer Code und würde vom nativen Stapel ausgeführt, nicht vom Java-Stapel.
quelle
native
ist ein Schlüsselwort in Java, es zeigt plattformabhängig an.native
Methoden fungieren als Schnittstelle zwischen Java ( JNI ) und anderen Programmiersprachen.quelle
Die Java-
native
Methode bietet einen Mechanismus für Java-Code zum Aufrufen von nativem OS-Code, entweder aus funktionalen oder aus Leistungsgründen.Beispiel:
In der entsprechenden
Runtime.class
Datei in OpenJDK, die sich in befindetJAVA_HOME/jmods/java.base.jmod/classes/java/lang/Runtime.class
, sind diese Methoden enthalten und mitACC_NATIVE
(0x0100
) gekennzeichnet. Diese Methoden enthalten kein Code-Attribut . Dies bedeutet, dass diese Methode keine tatsächliche Codierungslogik in derRuntime.class
Datei enthält:availableProcessors
: als nativ und ohne Code-Attribut markiertfreeMemory
: als nativ und ohne Code-Attribut markierttotalMemory
: als nativ und ohne Code-Attribut markiertmaxMemory
: als nativ und ohne Code-Attribut markiertgc
: als nativ und ohne Code-Attribut markiertDie eigentliche Codierungslogik befindet sich in der entsprechenden Runtime.c- Datei:
Diese
C
Codierung wird in die Dateilibjava.so
(Linux) oderlibjava.dll
(Windows) kompiliert , die sich unterJAVA_HOME/jmods/java.base.jmod/lib/libjava.so
folgender Adresse befindet :Referenz
quelle