180 likes | 273 Views
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
E N D
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 __cplusplus • extern "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 : Pointeur sur GetFieldID Pointeur sur GetMethodID Pointeur sur FindClass … GetFieldID() GetMethodID() FindClass() JNIEnv *
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 • Accès direct aux primitives Java • Passage des données de type primitif par valeur Java Type Native Type Size in bits Boolean Jboolean 8, unsigned Byte Jbyte 8 Char Jchar 16, unsigned Short Jshort 16 Int Jint 32 Long Jlong 64 Float Jfloat 32 Double Jdouble 64 Void Void n/a
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 - rapide Code C Code Java +rapide C & Java
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/