Interfaçage Java et C/C++
Présentation de Système
Ecole : Ingénieurs 2000
Filière : Informatique & Réseaux
Auteur : Cyril MOQUEREAU
Année : 2001/2002
Plan d’étude
Le principe de fonctionnement Prise en main
Les possibilités de la JNI Manipulation des Strings, des tableaux, objets Java, etc...
Les limites d ’utilisation Portabilité, Efficacité, Sécurité
I. Cas d’utilisation de la JNI
Accéder aux ressources système
Utiliser du code déjà implémenté
Coder une partie critique d ’un programme
Présentation d’un exemple Les objectifs :
Interfacer un programme Java avec du code C Décomposer la réalisation Observer les principes de base
Les étapes de réalisation :
1. Réalisation d’un programme Java
2. Création du fichier de prototypage
3. Implémentation des méthodes natives
4. Compilation / Exécution du programme
1ère étape : Réalisation du programme Java
class HelloWorld {
public native void displayHelloWorld();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
2ème étape (1) : Création du fichier de prototypage
1. javac HelloWorld.java
2. javah HelloWorld/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class HelloWorld */#ifndef _Included_HelloWorld#define _Included_HelloWorld#ifdef __cplusplusextern "C" {#endif/* * Class: HelloWorld * Method: displayHelloWorld * Signature: ()V */JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif
3.
2ème étape (2) : L ’argument JNIEnv
Fonction : Interagir avec la JVM
Comportement :
JNIEnv *
Pointeur sur GetFieldIDPointeur sur GetMethodIDPointeur sur FindClass
…
GetFieldID()
GetMethodID()
FindClass()
3ème étape : Implémentation du code natif
#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(
JNIEnv *env, jobject obj)
{
printf("Hello world!\n");
return;
}
4ème étape : Compilation et Exécution
Compiler le code C (exemple sous Linux) :$ gcc -shared -I ./java/include \
–I ./java/include/linux HelloWorldImp.c -o libhello.so
Génère une librairie dynamique
Exécution du programme :
$ java HelloWorld Appel de la méthode native par :
System.loadLibrary("hello");
Les types primitifs de la JNI
Java Type Native Type Size in bitsBoolean Jboolean 8, unsignedByte Jbyte 8Char Jchar 16, unsignedShort Jshort 16Int Jint 32Long Jlong 64Float Jfloat 32Double Jdouble 64Void Void n/a
Accès direct aux primitives Java
Passage des données de type primitif par valeur
II. Les possibilités de la JNI
Passer des tableaux ou des chaînes de caractères
Interfacer un objet Java
Gérer des exceptions Java
Passage d ’un objet Java (1 - Code Java)
class MyJavaClass { public int aValue; public void divByTwo() { aValue /= 2; }
}
public class UseObjects { private native void changeObject(MyJavaClass obj);
static { System.loadLibrary("UseObjImpl"); }
public static void main(String[] args) { UseObjects app = new UseObjects(); MyJavaClass anObj = new MyJavaClass(); anObj.aValue = 2; app.changeObject(anObj); System.out.println("Java: " + anObj.aValue); }
}
Passage d ’un objet Java (2 - Code natif)
#include <jni.h>
extern "C" JNIEXPORT void JNICALL Java_UseObjects_changeObject( JNIEnv* env, jobject,jobject
obj) { jclass clas = env->GetObjectClass(obj); jfieldID fid = env->GetFieldID(clas, "aValue", "I"); jmethodID mid = env->GetMethodID(clas, "divByTwo", "()V");
int value = env->GetIntField(obj, fid);
printf("Native: %d\n", value); env->SetIntField(obj, fid, 6); env->CallVoidMethod(obj, mid); value = env->GetIntField(obj, fid); printf("Native: %d\n", value);}
Signatures des types de la JVM
Signature Type le langage Java
Z boolean
B byte
C char
S short
I int
J long
F float
D double
III. Limites de la JNI
Perte de portabilité Compilation Rattachement à un système
Problèmes d’efficacité Passages d ’information de la JNI vers la JVM
Faille de sécurité Accès aux ressources systèmes
Efficacité : graphe comparatif
Code C
Code Java
C & Java
+rapide
- rapide
Bilan d’étude
Des améliorations ont vu le jour entre 1.0, 1.1 et 1.2
Solution à considérer en dernier recours
Possibilités de la version Java 1.4 suppression de la pile liée au code natif accès directe aux classes / méthodes C++
Bibliographie
Ressources JNI http://java.sun.com/docs/books/tutorial/native1.1 http://developer.java.sun.com/developer/ http://penserenjava.free.fr/pens/indexMain_18&00.htm http://www.javaworld.com/jw-10-1998/jw-10-apptowin32.html
#resources
Tests d ’efficacité http://www.hyperactiveinc.com/tips.asp?tech=Java http://www.str.com.au/jnibench/