wiki:InsiaProgJavaC

Sommaire

Interfacer C et Java

Dans ce cours, nous apprenons à interfacer une bibliothèque en C avec un programme en Java. Ceci est à distinguer du cas où l'on embarque du code Java dans un programme C.

Ressources:

Utilisateurs Debian: vous n'êtes pas obligés d'utiliser le JRE propriétaire de Sun, il suffit d'installer les paquets suivants:

java-gcj-compat-dev classpath-common classpath-tools

Programme de départ

Nous partons du fameux programme HelloWorld?. Nous avons une fonction simple en Java (HelloWorld?.sayHello) que nous allons remplacer par une implémentation en C (dite native):

Implémentation native

Si le premier programme s'exécute bien, le second provoque une erreur d'exécution, car la méthode sayHello n'a pas d'implémenation connue. Pour la fournir, nous devons d'abord extraire le fichier d'interface C (extension .h) à l'aide de l'outil "javah". Lancez la commande javah HelloWorldNative, vous obtiendrez un fichier HelloWorldNative.h contenant entre autre cette ligne:

JNIEXPORT void JNICALL Java_HelloWorldNative_sayHello (JNIEnv *env, jclass, jstring);

De manière générale, nous obtenons un prototype C par méthode native Java à implémenter. Il nous reste à fournir une implémentation (en C!):

Puis de la compiler en tant que bibliothèque dynamique, afin que nous la chargions à l'exécution du programme Java. Ceci demande la mise en place des chemins corrects du JRE (ou de Classpath). Voir source:/insia/c/jni/Makefile pour un exemple basé sur GNU Classpath.

Exécution d'une méthode native

Il suffit de charger explicitement la bibliothèque dynamique au démarrage du programme:

System.loadLibrary("helloworld");

Le chargement de la bibliothèque se fait selon les conventions du système d'exploitation. Sous GNU/Linux, l'instruction ci-dessus déclenche la recherche d'un fichier libhelloworld.so dans les répertoires système (/lib, /usr/lib) et utilisateur (dans la variable d'environnement LD_LIBRARY_PATH). Vous pouvez par exemple invoquer votre programme ainsi pour pouvoir charger la bibliothèque que vous venez de compiler dans le répertoire courant:

$ LD_LIBRARY_PATH=. java HelloWorldNative
Hello (native) World !

Sous Windows, la bibliothèque s'appellerait helloworld.dll et serait recherché parmis les répertoires sytèmes (Windows/WinNT, System, System32 et utilisateur (variable d'environnement PATH).

Passage de paramètres

Les paramètres en entrée de la méthode Java se retrouvent en tant que paramètres de la fonction C, après les arguments standards du JNI (l'environnement de la JVM et l'objet courant). Notez que pour des méthodes statiques, il n'y a pas d'objet courant et l'argument jclass est nul. De même, la fonction C renvoie un type similaire à celui renvoyé par la méthode implémentée.

Se référer à la documentation de JNI pour de plus amples détails.

Last modified 14 years ago Last modified on Nov 26, 2006, 11:56:13 PM