Java est capable d'utiliser du code natif pour réaliser certaines fonctions spécifiques à un système d'exploitation (en général des fonctions de bas niveau telle que la gestion des utilisateurs, ...).
Une partie de l'API Java a recourt à du code natif (accès aux fichiers, interface graphique).
Les applications Java peuvent également faire appel à du code natif pour étendre les possibilités de l'application, ou pour améliorer les performances de l'application. L'inconvénient majeur est que cela amoindrie la portabilité de celle-ci.
Principes.
L'appel au code natif depuis Java se fait avec l'API JNI (Java Native Interface).
Côté Java.
L'application Java peut faire appel à des méthodes déclarées avec le mot-clé codice_1 et ne comportant pas de corps d'implémentation (comme les méthodes abstraites) car le code natif est dans un fichier séparé.
Côté code natif.
Le code natif doit fournir l'implémentation des méthodes déclarées comme codice_1 dans les classes Java.
En théorie, il peut utiliser n'importe quel langage de programmation.
En pratique, le C et le C++ sont les plus utilisés.
De plus le JDK fournit l'outil codice_3 pour générer un fichier d'en-tête (*.h) à partir d'une classe Java compilée (*.class).
Ce fichier d'en-tête contient une déclaration pour chaque méthode déclarée avec le mot clé codice_1.
Il faut ensuite créer un projet de type DLL et implémenter les fonctions du fichier d'en-tête généré.
Le résultat de la compilation est une librairie de fonctions qui doit être accessible depuis l'application Java.
Sous Windows, il s'agit d'une Dynamically Linked Library (*.dll).
Sous Linux, il s'agit d'un Shared Object (*.so).
Lien Java-Code natif.
Le lien est assuré par le code Java qui doit utiliser la méthode statique codice_5.
Celle-ci a pour paramètre le nom de la librairie de code natif à charger en mémoire.
La librairie implémentant une méthode native doit impérativement être chargée avant l'appel à la méthode.
Elle doit être située dans l'un des chemins listés par la propriété codice_6.
Si la librairie nommée n'est pas trouvée, une exception java.lang.UnsatisfiedLinkError est lancée.
Comme la librairie doit être chargée avant toute utilisation de la classe, le chargement est généralement fait dans le bloc d'initialisation statique de la classe.
Portabilité.
Le nom de la librairie fourni à la méthode statique codice_5 ne dépend pas du système d'exploitation car la JVM se charge de transformer le nom de librairie en nom de fichier.
Pour une librairie nommée codice_8, le fichier chargé par la JVM sera :
Pour qu'une application utilisant du code natif puisse s'exécuter sur différentes plateformes, il faut fournir une librairie pour chacune d'entre elle.
Étapes.
Le développement d'application appelant du code natif se déroule en général de la façon suivante :

Programmation Java/Sommaire
Photographie/Traitements couleurs/Traitement des films inversibles couleurs