Sous-programmes en C pour programmes Java

On utilise JNI : Java Native Interface (voir les liens).

1. Appel d'un sous-programme C dans une méthode Java

A. Le programme Java

B. L'entête en C

C. Sous-programme en C

D. Création de la bibliothèque

E. Exécution

F. Exemple complet

MaClasse.javabiblio.c
// MaClasse.java
public class MaClasse
{
    static { System.loadLibrary( "biblio" ); } 

    native public static void cProcedure(); 

    public static void main( String [] args )
    {
        System.out.println( "affichage java" );
        cProcedure();
    } // main()
} // Java2C
/* biblio.c */
#include <stdio.h>
#include "MaClasse.h"

JNIEXPORT void JNICALL Java_MaClasse_cProcedure
  ( JNIEnv * env, jclass cla )
{
    printf( "affichage c\n" );
} /* ..._cProcedure() */

 

2. makefile typique de communication Java/C : à télécharger (pas de copier/coller !)

CLASSE = MaClasse
PROGC  = biblio
#
# adapter la ligne ci-dessous en fonction du PC
INCDIR = /usr/lib/jdk1.5.0v9/include
#INCDIR = /usr/java/j2sdk1.4.2/include
#
CFLAGS = -std=c99 -pedantic -W -Wall
IFLAGS = -I$(INCDIR) -I$(INCDIR)/linux
LFLAGS = -shared

all : $(CLASSE).class lib$(PROGC).so 

%.class : %.java
        javac $<
        javah $(basename $<)

%.c : %.h
        touch $@

%.o : %.c
        gcc $(CFLAGS) $(IFLAGS) -o $@ -c $<

lib%.so : %.o
        gcc $(LFLAGS) -o $@  $<
        @echo ____________________ Tapez la ligne suivante avant la premiere execution :
        @echo ____________________ setenv LD_LIBRARY_PATH .

#.SECONDARY : $(PROGC).o

TOCLEAN = $(CLASSE).h $(PROGC).o *~
clean :
        rm -f $(TOCLEAN)
cleanall :
        rm -f lib$(PROGC).so $(CLASSE).class $(TOCLEAN)
Les lignes commençant par  #  sont des commentaires.
Il suffit de taper make pour reconstruire le programme.
Il est possible de taper make clean pour supprimer les fichiers inutiles, ou make cleanall pour ne conserver que les sources.
La seule chose à modifier est le nom de la classe et le nom du programme C au début du fichier, et éventuellement la valeur de INCDIR en fonction du PC sur lequel on travaille.
 

3. Échange de données entre Java et C

A. Récupérer les paramètres Java dans une procédure en C

B. Valeur de retour d'une fonction C, pour la récupérer en Java

A COMPLETER

4. Pour en savoir plus :