
43 Code natif (JNI)
Dans ce chapitre, nous allons voir comment on peut mélanger du code écrit dans un autre langage à l'intérieur du code Java .
Précisons tout de suite que cette possibilité ne doit être utilisé que dans des cas exceptionnels. En effet, le fait
d'introduire du code natif dans Java enlève un certain nombre d'attraits de ce langage: la portabilité, l'indépenance de la
plate forme utilisé, possibilité de téléchargement etc...
Pourquoi donc vouloir mélanger Java avec un autre langage ?
Tout d'abord, Java ne permet d'accéder aux fonctionnalités spécifique d'un système. Par exemple, il n'est pas possible avec Java
de manipuler des cartes d'acquisition. Toutes ces manipulations proches du système se fera donc dans un autre langage et sera
interfacer avec Java pour le reste de l'application.
Ensuite, il peut être intéressant d'interfacer un code récent Java avec une application existante écrite dans un autre langage. La
récriture complète serait bien trop fastidieuse.
Enfin, il existe des application dans lesquelles des bouts critiques doivent s'exécuter de manière extrèmement efficace. On pourra
alors récrire ces parties cruciales dans un langage plus efficace (plus proche de la machine).
L'interface Java permettant de lier du code natif au code Java est désigné par le terme JNT (Java Native Interface) Dans ce qui
va suivre nous allons plus particulièrement nous intéresser à la programmation des méthodes natives en C et la fin du chapitre
présentera les particularité de ce type de lien avec C++.
Dans la communication entre Java et un autre langage comme C qui n'est pas un langage orienté objet, il y a plusieurs problèmes
à résoudre:
Mise en correspondance des identificateurs Java (Unicode ) en identificateurs C ou C++ .
Mise en correspondance des méthodes: C ne dispose ni d'objets ni de packages, il faut trouver, malgré tout un moyen
de faire correpondre une méthode Java (qui est sous la forme package.classe.méthode) à une fonction C .
Les méthodes (non statiques) s'applique sur des objets (implicitement this)
Lier l'invocation d'une méthode à l'exécution d'une fonction, par exemple
transmettre les paramètres entre la méthode Java et la focntion C
Manipulation des champs des classes
Gestion des erreurs avec des exceptions; C ne dispose d'un système d'exception.
Fiabilité du code: par exemple, les problèmes de gestion mémoire, de sécurité d'accès aux élements d'un tableaux, etc.
Création d'objets Java depuis C.
etc.
Un exemple
43.1.1 Déclarer une méthode native
Une méthode native est une méthode dont l'implantation est réalisée dans un autre langage que Java généralement du C ou C++.
Une méthode est qualifiée de native, lorsque il comporte le qualifier (ou modifier ) natif.
public native void afficherHello();
Il n'est évidemment pas question de donner une quelconque implantation de cette méthode puisqu'elle censé être faite dans un
autre langage que Java .
43.1.2 Charger la librarie C
Après implantation du code natif C, on devra la copiler et produire une bibliothèque dynamique. Cette bibliothèque devra être
chargée au chargement de la classe Hello. Le chargement d'une bibliothèque se fait avec la méthode
System.load(...) ou System.loadLibrary(...). En supposons que cette bibliothèque se nomme
libhello.so (pour UNIX ) ou libhello.dll (pour Windows ), voici le code complet de la classe Hello.
public class Hello
public native void afficherHello();
static System.load("Hello");