Présentation de l'interface JNI
Du point de vue d'une machine virtuelle Java, il existe deux types de code: "Java™" et "native". L'interface JNI (Java Native Interface) établit une interface bien définie et indépendante de la plateforme entre les deux.
Le code natif peut être utilisé avec Java de deux manières distinctes: en tant que "méthodes natives" dans une machine virtuelle Java en cours d'exécution et en tant que code qui crée une machine virtuelle Java à l'aide de l'"API d'appel". Cette section décrit les différences.
Méthodes natives
Les méthodes natives Java sont déclarées dans Java, implémentées dans un autre langage (tel que C ou C + +) et chargées par la machine virtuelle Java selon les besoins. Pour pouvoir utiliser des méthodes natives, vous devez :
- Déclarez la méthode native dans votre code Java.
Lorsque le compilateur javac détecte une déclaration de méthode native dans le code source Java, il enregistre le nom et les paramètres de la méthode. Comme le code source Java ne contient pas d'implémentation, le compilateur marque la méthode comme étant "native". La JVM peut ensuite résoudre la méthode correctement lorsqu'elle est appelée.
- Implémenter la méthode native.
Les méthodes natives sont implémentées sous forme de points d'entrée externes dans une bibliothèque binaire chargeable. Le contenu d'une bibliothèque native est spécifique de la plateforme. L'interface JNI permet à la JVM d'utiliser n'importe quelle méthode native indépendamment de la plateforme.
La JVM appelle les méthodes natives. Lorsque la JVM se trouve dans une méthode native, l'interface JNI permet de "rappeler" à la JVM.
- Charger le code de la méthode native à utiliser par la machine virtuelle.
Outre la déclaration de la méthode native, vous devez rechercher et charger la bibliothèque native qui contient la méthode lors de l'exécution.
Deux interfaces Java chargent les bibliothèques natives:
- java.lang.System.load()
- java.lang.System.loadLibrary()
Généralement, une classe qui déclare des méthodes natives charge la bibliothèque native dans son initialiseur statique.
API d'appel
La création d'une JVM implique du code natif. L'aspect de l'interface JNI utilisée à cette fin s'appelle l'API d'appel JNI. Pour utiliser cette API, vous vous liez à une bibliothèque spécifique de l'implémentation, de manière statique ou dynamique, et appelez les fonctions JNI_* qu'elle exporte.
La spécification et l'implémentation JNI
La spécification JNI est vague en ce qui concerne les informations d'implémentation sélectionnées. Elle fournit une infrastructure réutilisable pour les interfaces simples et extensibles natives C et C++. Le modèle JNI est également la base de la spécification JVMTI.
La spécification de marque Oracle Corporation et le kit JCK (Java Compatibility Kit) garantissent la conformité à la spécification mais pas à l'implémentation. Le code natif doit être conforme à la spécification, mais pas à l'implémentation. Le code écrit par rapport à un comportement non spécifié est source de problèmes de portabilité et de compatibilité aval.