En jouant à ce puzzle (c'est un jeu-questionnaire sur les mots-clés Java), je suis tombé sur le native
mot - clé.
À quoi sert le mot-clé natif en Java?
java
java-native-interface
native
keyword
tourbillon
la source
la source
Réponses:
Le
native
mot-clé est appliqué à une méthode pour indiquer que la méthode est implémentée en code natif à l'aide de JNI (Java Native Interface).la source
Exemple exécutable minimal
Main.java
Principal c
Compiler et exécuter:
Production:
Testé sur Ubuntu 14.04 AMD64. Fonctionne également avec Oracle JDK 1.8.0_45.
Exemple sur GitHub pour jouer avec.
Les soulignements dans les noms de package / fichier Java doivent être échappés avec
_1
le nom de la fonction C, comme indiqué dans: Appel des fonctions JNI dans le nom de package Android contenant un soulignementInterprétation
native
vous permet de:Cela pourrait être utilisé pour:
avec le compromis d'une portabilité inférieure.
Il vous est également possible d'appeler Java à partir de C, mais vous devez d'abord créer une JVM en C: Comment appeler des fonctions Java à partir de C ++?
Des API d'extension natives analogues sont également présentes dans de nombreux autres "langages VM" pour les mêmes raisons, par exemple Python , Node.js , Ruby .
Android NDK
Le concept est exactement le même dans ce contexte, sauf que vous devez utiliser un passe-partout Android pour le configurer.
Le référentiel NDK officiel contient des exemples "canoniques" tels que l'application hello-jni:
En vous
unzip
une.apk
avec NDK sur Android O, vous pouvez voir la pré-compilé.so
correspondant au code natif souslib/arm64-v8a/libnative-lib.so
.TODO confirme: en outre,
file /data/app/com.android.appname-*/oat/arm64/base.odex
dit qu'il s'agit d'une bibliothèque partagée, qui je pense est le .dex AOT précompilé correspondant aux fichiers Java dans ART, voir aussi: Que sont les fichiers ODEX dans Android? Alors peut-être que Java est également exécuté via unenative
interface?Exemple dans OpenJDK 8
Trouvons trouver où
Object#clone
est défini dans jdk8u60-b27.Nous conclurons qu'il est implémenté par un
native
appel.On trouve d'abord:
ce qui nous amène à jdk / src / share / classes / java / lang / Object.java # l212 :
Vient maintenant la partie difficile, trouver où le clone est au milieu de toute l'indirection. La requête qui m'a aidé était:
qui trouverait des fichiers C ou C ++ qui pourraient implémenter les méthodes natives d'Object. Cela nous amène à jdk / share / native / java / lang / Object.c # l47 :
ce qui nous amène au
JVM_Clone
symbole:ce qui nous amène à hotspot / src / share / vm / prims / jvm.cpp # l580 :
Après avoir développé un tas de macros, nous arrivons à la conclusion que c'est le point de définition.
la source
static
native
méthode Java, le deuxième paramètre de la fonction C ++ est de typejclass
et nonjobject
.Il marque une méthode, qu'il sera implémenté dans d'autres langages, pas en Java. Il fonctionne avec JNI (Java Native Interface).
Des méthodes natives ont été utilisées dans le passé pour écrire des sections critiques pour les performances, mais avec l'accélération de Java, cela est désormais moins courant. Des méthodes natives sont actuellement nécessaires lorsque
Vous devez appeler une bibliothèque à partir de Java écrite dans une autre langue.
Vous devez accéder aux ressources système ou matérielles qui sont uniquement accessibles à partir de l'autre langue (généralement C). En fait, de nombreuses fonctions système qui interagissent avec un ordinateur réel (disque et réseau IO, par exemple) ne peuvent le faire que parce qu'elles appellent du code natif.
Voir aussi Spécification de l'interface native Java
la source
currentTimeMillis
font partie du JDK et sont annotéesnative
car l'implémentation se trouve dans le code source du JDK lui-même. Il est très peu probable que l'implémentation utilise le langage d'assemblage; il appelle probablement une méthode API du système d'exploitation sur lequel la JVM s'exécute. Par exemple, sous Windows, il peut appeler une méthode DLLGetSystemTime
dans kernel32.dll. Sur un autre OS, il aura une implémentation différente. Cependant, lorsque vous utiliseznative
une méthode que vous écrivez (par opposition à une méthode JDK), vous devez fournir l'implémentation à l'aide de JNI.currentTimeMillis
est marqué comme natifjava.lang.System
donc il utilise JNI, n'est-ce pas?Directement à partir de la spécification du langage Java :
la source
Comme SLaks a répondu, le
native
mot clé est pour appeler le code natif.Il est également utilisé par GWT pour implémenter des méthodes javascript.
la source
les fonctions qui implémentent du code natif sont déclarées natives.
http://en.wikipedia.org/wiki/Java_Native_Interface
la source
NATIVE est Non access modifier.it peut être appliqué uniquement à METHOD. Il indique l'implémentation PLATFORM-DEPENDENT de la méthode ou du code.
la source
native est un mot clé en java, qui est utilisé pour créer une structure (méthode) non implémentée comme abstraite, mais ce serait une plate-forme dépendante telle que le code natif et exécutée à partir de la pile native et non de la pile java.
la source
native
est un mot-clé en java, il indique la plateforme dépendante.native
Les méthodes sont des interfaces entre Java ( JNI ) et d'autres langages de programmation.la source
La
native
méthode Java fournit un mécanisme permettant au code Java d'appeler le code natif du système d'exploitation, pour des raisons fonctionnelles ou de performances.Exemple:
Dans le correspondant
Runtime.class
fichier dans OpenJDK, situé dansJAVA_HOME/jmods/java.base.jmod/classes/java/lang/Runtime.class
, contient ces méthodes et les a marquées avecACC_NATIVE
(0x0100
), et ces méthodes ne contiennent pas l' attribut Code , ce qui signifie que ces méthodes n'ont pas de logique de codage réelle dans leRuntime.class
fichier:availableProcessors
: balisé comme natif et sans attribut CodefreeMemory
: étiqueté comme natif et sans attribut CodetotalMemory
: étiqueté comme natif et sans attribut CodemaxMemory
: étiqueté comme natif et sans attribut Codegc
: étiqueté comme natif et sans attribut CodeEn fait, la logique de codage est dans le correspondant fichier Runtime.c :
Et ces
C
codages sont compilés dans le fichierlibjava.so
(Linux) oulibjava.dll
(Windows), situé àJAVA_HOME/jmods/java.base.jmod/lib/libjava.so
:Référence
la source