Maison  >  Article  >  Java  >  Comment utiliser le modificateur Native en Java

Comment utiliser le modificateur Native en Java

王林
王林avant
2023-04-22 15:46:081833parcourir

L'utilisation du modificateur Native

native est principalement utilisée pour les méthodes

1. Une méthode native est une interface permettant à Java d'appeler du code non Java. Une méthode native signifie que l'implémentation de la méthode est implémentée dans un langage non Java, tel que C ou C++.

2. Lors de la définition d'une méthode native, le corps d'implémentation n'est pas fourni (plus comme la définition d'une interface Java), car son corps d'implémentation est implémenté en externe par un langage non Java.

Explication

Le langage Java lui-même ne peut pas accéder et faire fonctionner la couche inférieure du système d'exploitation, mais il peut appeler d'autres langages via l'interface JNI pour accéder à la couche inférieure.

JNI est Java Native Interface, une interface de programmation native, qui fait partie du Java Software Development Kit (SDK). JNI permet au code Java d'utiliser du code et des bibliothèques de codes écrits dans d'autres langages.

L'API d'invocation (qui fait partie de JNI) peut être utilisée pour intégrer la machine virtuelle Java (JVM) dans des applications natives, permettant aux programmeurs d'appeler du code Java à partir du code natif.

Exemple

Dans le code source du JDK, prenez system.class comme exemple Puisque les méthodes pertinentes du système d'exploitation sont appelées et que l'opération n'est pas implémentée en Java, il y aura de nombreuses méthodes de modification natives

Comment utiliser le modificateur Native en Java

.

Modification native À quoi sert cette méthode

J'ai accidentellement regardé le code aujourd'hui et j'ai découvert que quelqu'un d'autre l'avait écrit de cette façon, et il y avait plusieurs fichiers dll dans le pot, ce qui était assez étrange, alors j'ai ouvert le code et j'ai trouvé la méthode d'écriture suivante.

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

Je trouve que c'est assez intéressant. J'ai cherché des informations sur Internet et ça fait du bien. Une autre méthode d'utilisation de Java pour appeler d'autres langues (je ne la connaissais pas avant -_#)

J'ai passé deux heures aujourd'hui à lire un article en anglais sur ce qu'est la méthode native. Ce qui suit est ma compréhension basée sur l'original. texte. .

Qu'est-ce que la méthode native

En termes simples, une méthode native est une interface permettant à Java d'appeler du code non-java. Une méthode native est une méthode Java dont l'implémentation est implémentée dans un langage non Java, tel que C. Cette fonctionnalité n'est pas propre à Java. De nombreux autres langages de programmation disposent de ce mécanisme. Par exemple, en C++, vous pouvez utiliser extern "C" pour indiquer au compilateur C++ d'appeler une fonction C.

"Une méthode native est une méthode Java dont l'implémentation est assurée par du code non-java."

Lors de la définition d'une méthode native, elle ne fournit pas de corps d'implémentation (un peu comme définir une interface Java), car son implémentation body Il est implémenté en externe par des langages non Java. , un exemple est donné ci-dessous :

   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 ;
    }

La déclaration de ces méthodes décrit à quoi ressemble certains codes non-java dans ces codes java (vue

L'identifiant natif peut être utilisé avec tous les autres identifiants java, sauf abstrait). . C'est raisonnable, car native implique que ces méthodes ont des implémentations, mais ces implémentations ne sont pas Java, mais abstract indique clairement que ces méthodes n'ont aucune implémentation. Lorsque native est utilisée avec d'autres identifiants Java, sa signification n'est pas différente de celle d'une méthode non native. Par exemple, native static indique que cette méthode peut être appelée directement sans générer d'instance de classe, par exemple. vous souhaitez utiliser une méthode native pour l’appeler une bibliothèque de classes C. La troisième méthode ci-dessus utilise la synchronisation native. La JVM exécutera un mécanisme de verrouillage de synchronisation avant d'entrer dans l'implémentation de cette méthode (tout comme le multi-threading de Java.)

Une méthode native peut renvoyer n'importe quel type Java, y compris les types non basiques, et un contrôle des exceptions peut également être effectué. L'implémentation de ces méthodes peut créer une exception et la lever, ce qui est très similaire aux méthodes Java. Lorsqu'une méthode native reçoit des types non basiques tels qu'un objet ou un tableau d'entiers, la méthode peut accéder aux éléments internes de ces types non basiques, mais cela rendra la méthode native dépendante de l'implémentation de la classe Java à laquelle vous accédez. Une chose à garder à l'esprit est que nous pouvons accéder à toutes les fonctionnalités Java dans une implémentation native d'une méthode native, mais cela dépend de l'implémentation des fonctionnalités Java auxquelles vous accédez, et cela est bien inférieur à l'utilisation de celles du langage Java. Les fonctionnalités sont pratiques et simples.

L'existence de méthodes natives n'aura aucun impact sur les autres classes appelant ces méthodes natives. En fait, les autres classes appelant ces méthodes ne savent même pas qu'elles appellent une méthode native. La JVM contrôlera tous les détails de l’appel des méthodes natives. Nous devons faire attention à la situation lorsque nous déclarons une méthode locale comme définitive. Les corps de méthodes implémentés en Java peuvent connaître des améliorations d'efficacité grâce à l'intégration lors de leur compilation. Cependant, on peut se demander si une méthode finale native peut également obtenir de tels avantages, mais il ne s'agit que d'un problème d'optimisation du code et n'a aucun impact sur l'implémentation fonctionnelle.

Si une classe contenant une méthode locale est héritée, la sous-classe héritera de la méthode locale et pourra remplacer cette méthode en langage Java (cela semble un peu étrange) De même, si une méthode locale est marquée par fianl, elle est héritée. ne peut pas être écrasé ultérieurement.

Les méthodes locales sont très utiles car elles étendent efficacement le jvm.En fait, le code java que nous écrivons a déjà utilisé des méthodes locales. Dans la mise en œuvre du mécanisme de concurrence java (multi-threading) de Sun, de nombreux contacts avec le système d'exploitation sont des méthodes locales. utilisé à tous les points, ce qui permet aux programmes Java de transcender les limites du runtime Java. Avec les méthodes natives, un programme Java peut effectuer n’importe quelle tâche au niveau de l’application.

Pourquoi utiliser la méthode native

Java est très pratique à utiliser, mais certains niveaux de tâches ne sont pas faciles à implémenter en Java, ou lorsque l'on est très préoccupé par l'efficacité du programme, des problèmes surviennent.

Interaction avec l'extérieur de l'environnement Java : Parfois, les applications Java doivent interagir avec l'environnement extérieur à Java. C'est la principale raison pour laquelle les méthodes locales existent. Vous pouvez penser à la situation dans laquelle Java doit échanger des informations avec certains systèmes sous-jacents tels que le système d'exploitation ou certains matériels. Les méthodes locales sont exactement un tel mécanisme de communication : elles nous fournissent une interface très simple, et nous n'avons pas besoin de comprendre les détails fastidieux en dehors de l'application Java.

Interagir avec le système d'exploitation : JVM prend en charge le langage Java lui-même et la bibliothèque d'exécution. C'est la plateforme sur laquelle s'appuient les programmes Java. Elle se compose d'un interpréteur (interprétant le bytecode) et de quelques bibliothèques connectées au code natif. Cependant, ce n’est pas un système complet après tout. Il repose souvent sur le support de certains systèmes sous-jacents. Ces systèmes sous-jacents sont souvent des systèmes d’exploitation puissants. En utilisant des méthodes natives, nous pouvons utiliser Java pour réaliser l'interaction entre jre et le système sous-jacent. Même certaines parties de la JVM sont écrites en C. De plus, si nous voulons utiliser certaines fonctionnalités du système d'exploitation que le langage Java lui-même fait. ne fournit pas d'encapsulation, nous devons également utiliser des méthodes natives.

Java de Sun : L'interpréteur de Sun est implémenté en C, ce qui le fait interagir avec l'extérieur comme un C ordinaire. La plupart des jre sont implémentés en Java et interagissent également avec le monde extérieur via certaines méthodes locales. Par exemple : la méthode setPriority() de la classe java.lang.Thread est implémentée en java, mais elle appelle la méthode locale setPriority0() dans la classe. Cette méthode native est implémentée en C et implantée dans la JVM. Sur la plateforme Windows 95, cette méthode native appellera à terme l'API Win32 SetPriority(). Il s'agit d'une implémentation spécifique d'une méthode locale fournie directement par la JVM. Le plus souvent, la méthode locale est fournie par une bibliothèque de liens dynamiques externe (external Dynamic Link Library) puis appelée par la JVM.

Comment JVM fait fonctionner la méthode native

Nous savons que lorsqu'une classe est utilisée pour la première fois, le bytecode de cette classe sera chargé en mémoire et ne sera rechargé qu'une seule fois. Une liste de tous les descripteurs de méthode de la classe est conservée à l'entrée du bytecode chargé. Ces descripteurs de méthode contiennent les informations suivantes : où le code de méthode est stocké, quels sont ses paramètres et le descripteur de méthode (catégorie publique), etc. sur.

S'il y a du natif à l'intérieur d'un descripteur de méthode, ce bloc de descripteur aura un pointeur vers l'implémentation de la méthode. Ces implémentations se trouvent dans certains fichiers DLL, mais elles seront chargées dans l'espace d'adressage du programme Java par le système d'exploitation. Lorsqu'une classe avec une méthode native est chargée, sa DLL associée n'est pas chargée, donc le pointeur vers l'implémentation de la méthode n'est pas défini. Ces DLL ne seront chargées que lorsque la méthode native sera appelée, ce qui est réalisé en appelant java.system.loadLibrary().

La dernière chose à noter est que l'utilisation de méthodes locales entraîne une surcharge et fait perdre de nombreux avantages de Java. Si nous n'avons pas le choix, nous pouvons choisir d'utiliser des méthodes locales

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer