Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parClotaire Pineau Modifié depuis plus de 10 années
1
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 1 Cours n° 10 Interopérabilité logicielle I Entre C++ et Java
2
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 2 1.Java Native Interface (JNI) 1.Appel en Java de méthodes C++ 2.Appel en C++ de la JVM Sommaire
3
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 3 INTRODUCTION Programmation multilingue en Java, C++ et Perl Intérêts Java – Interfaces multilingues multimédia, communication réseau et services Web C++ – Calcul intensif (calcul opérationnel, graphes, grandes masse de données, …) Perl – Facilité de développement, bibliothèque de composants d’ingénierie linguistique (Flemm, Emerge, Brill, …) Méthodes utilisées Java Native Interface - communications Java C++ Edition de liens - communications C++ Perl
4
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 4 1. JAVA NATIVE INTERFACE Principes
5
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 5 1. JAVA NATIVE INTERFACE Bibliographie La programmation Sheng Liang, «Java(TM) Native Interface: Programmer's Guide and Specification », Addison-Wesley, 2000. La bible Rob Gordon, «Essential JNI : Java Native Interface», Prentice All, 1998. Sites sunsite.tus.ac.jp/java/docs/jdk1.1/jni.pdf (site officiel) xdprof.sourceforge.net/doxygen/structJNIEnv__.html (documentation API)
6
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 6 1.1. APPEL DE METHODES C++ EN JAVA Propriétés Appel à des librairies C et C++ (Cobol, Ada, Fortran) en Java Appels à des fonctions et des méthodes C++ Passage de paramètres (primitifs, String, tableaux, classes, objets), Lecture et modification d’objets Java (dans les fonctions et méthodes C++)
7
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 7 1.1. APPEL DE METHODES C++ EN JAVA Méthodologie 6 Etapes Création et compilation de la classe Java Modificateur « native » aux méthodes externes (pas de bloc d’instructions) Lecture de la librairie dynamique des méthodes externes Copie du fichier compilé (.class) dans un répertoire du projet C++ Création de l’interface (.h) par l’outil SUN « javah –jni …. » Création et compilation des méthodes C++ correspondantes Création de la librairie dynamique Copie de la librairie dynamique dans le répertoire du projet Java
8
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 8 1.1. APPEL DE METHODES C++ EN JAVA Caractéristiques des méthode C++ correspondantes JNIEXPORT Pr JNICALL Nm (env, OC, [Pe]) Pr : paramètre de retour Nm : nom de la méthode C++ env : référence sur l’environnement Java OC : un objet ou une classe dans le cas d’une méthode de classe Norme de construction du Nom de la méthode C++ Préfixe « Java » + « _ » + Nom du package Java + « _ » + Nom classe Java + « _ » + Nom méthode Java + « _ » + [Signature méthode (polymorphisme)]
9
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 9 1.1. APPEL DE METHODES C++ EN JAVA Correspondance entre les types Java primitifs et les types JNI JavaJNItaille en bits booleanjboolean8, unsigned bytejbyte8 charjchar16, unsigned shortjshort16 intjint32 longjlong64 floatjfloat32 doublejdouble64 void n/a
10
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 10 1.1. APPEL DE METHODES C++ EN JAVA Correspondance avec les types Java complexes JavaJNI tout objet Javajobject toute classe Javajclass Tableau jbyteArray, jcharArray, jshortArray, jintArray, jlongArray, jfloatArray, jdoubleArray, jbooleanArray Tableau d’objetsjobjectarray Stringjstring
11
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 11 1.1. APPEL DE METHODES C++ EN JAVA Signature des méthodes Norme de construction à partir des paramètres d’entrées et de retour (Concaténation des signatures des types des paramètres) Types primitifs « B »byte « C »char « D » double « F » float « I »int « J »long « S »short « Z »boolean Objets« L » + nom du package + nom de la classe Tableaux« [ » + signature de l’élément Signature de la méthode « ( » + signatures des paramètres d’entrée + « ) » + signature du paramètre de retour
12
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 12 1.1. APPEL DE METHODES C++ EN JAVA Méthodes de la classe JNIEnv (496) Conversion de String et de tableaux Méthodes Get… (Java -> C++) Méthodes Set… (C++ -> Java) Caractéristiques d’une classe, d’un objet, d’une méthode Création/Destruction d’un objet Appel de méthodes de classe (statiques) ou d’instance Traitement des exceptions
13
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 13 1.1.1. APPEL DE METHODES C++ EN JAVA Exemple1 – exo1.java (pas de paramètres) package cours4; public class exo1 { static native void fonction1(); public static void main(String[] args) { // chargement de la librairie lib1.dll System.loadLibrary("composantsDESS/lib1"); fonction1(); }
14
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 14 1.1.1. APPEL DE METHODES C++ EN JAVA cours4_exo1.h – void fonction1(void) /* DO NOT EDIT THIS FILE - it is machine generated */ #include extern "C" { /* * Class: cours4_exo1 * Method: fonction1 * Signature: ()V */ JNIEXPORT void JNICALL Java_cours4_exo1_fonction1 (JNIEnv *, jclass); }
15
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 15 1.1.1. APPEL DE METHODES C++ EN JAVA lib1.cpp – void fonction1(void) #include "cours4_exo1.h" #include using namespace std; JNIEXPORT void JNICALL Java_cours4_exo1_fonction1(JNIEnv *env, jclass) { cout C++" << endl; }
16
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 16 1.1.1. APPEL DE METHODES C++ EN JAVA lib1.dll Création d’une librairie dynamique dllwrap --driver-name=c++ --add-stdcall-alias -s lib1.o -o lib1.dll Recopie dans un répertoire accessible Exécution Java: chargement de la librairie lib1.dll Java: appel de la méthode native fonction1() C++: Mon premier appel Java->C++
17
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 17 1.1.2. APPEL DE METHODES C++ EN JAVA Exemple2 – exo2.java (paramètres de type primitifs) package cours4; public class exo2 { static native int fonction2(int i, int j); public static void main(String[] args) { System.loadLibrary("composantsDESS/lib2"); int i = 3,j = 4; System.out.println(i + " + " + j + " = " +fonction2(i,j)); }
18
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 18 1.1.2. APPEL DE METHODES C++ EN JAVA cours4_exo2.h – int fonction2(int, int) /* DO NOT EDIT THIS FILE - it is machine generated */ #include extern "C" { /* * Class: cours4_exo2 * Method: fonction2 * Signature: (II)I */ JNIEXPORT jint JNICALL Java_cours4_exo2_fonction2 (JNIEnv *, jclass, jint, jint); }
19
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 19 1.1.2. APPEL DE METHODES C++ EN JAVA lib2.cpp – int fonction2(int, int) #include "cours4_exo2.h" JNIEXPORT jint JNICALL Java_cours4_exo2_fonction2 (JNIEnv *env, jclass, jint i, jint j) { return i*j; } Exécution de exo2.java Java: chargement de la librairie lib2.dll Java: appel de la méthode native fonction2() 3 + 4 = 12
20
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 20 1.1.3. APPEL DE METHODES C++ EN JAVA Exemple3 – exo3.java (String, tableau, polymorphisme) package cours4; public class exo3 { static native void Affiche(double x); static native void Affiche(String mess); static native double Maximum(double[] vect); public static void main(String[] args) { double[] vect = {1.2, 2.3, 0.8, 5.1, 3.2}; System.loadLibrary("composantsDESS/lib3"); Affiche("Recherche de l'élément maximum"); double max = Maximum(vect); Affiche(max); }
21
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 21 1.1.3. APPEL DE METHODES C++ EN JAVA cours4_exo3.h (1) – void Affiche(double) /* DO NOT EDIT THIS FILE - it is machine generated */ #include extern "C" { /* * Class: cours4_exo3 * Method: Affiche * Signature: (D)V */ JNIEXPORT void JNICALL Java_cours4_exo3_Affiche__D (JNIEnv *, jclass, jdouble);
22
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 22 1.1.3. APPEL DE METHODES C++ EN JAVA cours4_exo3.h (2) – void Affiche(string) /* * Class: cours4_exo3 * Method: Affiche * Signature: (Ljava/lang/String;)V */ JNIEXPORT void JNICALL Java_cours4_exo3_Affiche__Ljava_lang_String_2 (JNIEnv *, jclass, jstring);
23
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 23 1.1.3. APPEL DE METHODES C++ EN JAVA cours4_exo3.h (3) – double Maximum(double[]) /* * Class: cours4_exo3 * Method: Maximum * Signature: ([D)D */ JNIEXPORT jdouble JNICALL Java_cours4_exo3_Maximum (JNIEnv *, jclass, jdoubleArray); }
24
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 24 1.1.3. APPEL DE METHODES C++ EN JAVA lib3.cpp (1) – void Affiche(double) #include "cours4_exo3.h" #include using namespace std; JNIEXPORT void JNICALL Java_cours4_exo3_Affiche__D (JNIEnv *env, jclass, jdouble x) { cout << x << endl; }
25
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 25 1.1.3. APPEL DE METHODES C++ EN JAVA lib3.cpp (2) – void Affiche(string) JNIEXPORT void JNICALL Java_cours4_exo3_Affiche__Ljava_lang_String_2 (JNIEnv *env, jclass, jstring jstr) { // recopie dans un tableau puis dans une string C++ string cstr(env->GetStringUTFChars(jstr, NULL)); cout << cstr << endl; // libération de la mémoire allouée pour le tableau env->ReleaseStringUTFChars(jstr, cstr.c_str()); }
26
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 26 1.1.3. APPEL DE METHODES C++ EN JAVA lib3.cpp (3) – double Maximum(double[]) JNIEXPORT jdouble JNICALL Java_cours4_exo3_Maximum (JNIEnv *env, jclass, jdoubleArray jtab){ // taille du tableau java et recopie dans un tableau C++ jint taille = env->GetArrayLength(jtab); jdouble *ctab = env->GetDoubleArrayElements(jtab, NULL); // calcul du maximum double max = ctab[0]; for (int i=1; i < taille; i++) if (ctab[i] > max) max = ctab[i]; // libération de la mémoire allouée pour le tableau C++ env->ReleaseDoubleArrayElements(jtab, ctab, 0); return (jdouble)max; }
27
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 27 1.1.4. APPEL DE METHODES C++ EN JAVA Exemple4 – exo4.java (classe Date3.java) public class exo4 { public static void main(String[] args) { Date3 heure = new Date3(); heure.AccesInstance(); } import cours2.Date2; public class Date3 extends Date2 { static {System.loadLibrary("composantsDESS/lib4");} native void AccesInstance(); }
28
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 28 1.1.4. APPEL DE METHODES C++ EN JAVA cours4_Date3.h – void AccesInstance(void) /* DO NOT EDIT THIS FILE - it is machine generated */ #include extern "C" { #endif /* * Class: cours4_Date3 * Method: AccesInstance * Signature: ()V */ JNIEXPORT void JNICALL Java_cours4_Date3_AccesInstance (JNIEnv *, jobject); }
29
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 29 1.1.4. APPEL DE METHODES C++ EN JAVA lib4.cpp (1) – void AccesInstance(void) - descripteur #include "cours4_Date3.h" #include using namespace std; JNIEXPORT void JNICALL Java_cours4_Date3_AccesInstance (JNIEnv *env, jobject obj) { // accès au descripteur de classe jclass cls = env->GetObjectClass(obj);
30
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 30 1.1.4. APPEL DE METHODES C++ EN JAVA lib4.cpp (2) – void AccesInstance(void) - Accès // accès à un attribut jfieldID fid = env->GetFieldID(cls, "minute", "I"); jint minute = env->GetIntField(obj, fid); cout << minute << endl; env->SetIntField(obj, fid, minute+1); // accès à une méthode jmethodID mid = env->GetMethodID(cls, "Afficher2", "()V"); env->CallVoidMethod(obj, mid); }
31
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 31 1.2. APPEL DE LA JVM EN C++ Propriétés Appel aux fonctionnalités de la JVM en Cobol, Ada, Fortran, C et C++ Chargement de classes Java, Création, lecture et modification d’objets Java, Appel des méthodes Java (passage de paramètres), Interception et génération d’exceptions,
32
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 32 1.2.1. APPEL DE LA JVM EN C++ Création de la machine virtuelle Java (JVM) 4 Etapes Positionnement des options en fonction de la version de Java (1, 2, bientôt 3), Chargement de la librairie dynamique de gestion de la JVM, Recherche de la fonction de création de la JVM (createJVM) Création de la machine virtuelle Implémentation Java2 (fonction CppToJava) Trois paramètres d’entrée (2 strings + 1 booléen) emplacement de la librairie dynamique de gestion de la JVM, répertoire de travail création (true) / destruction (false) Paramètre de retour (JNIEnv) référence sur un environnement Java
33
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 33 1.2.1. APPEL DE LA JVM EN C++ Exemple - exo5.cpp (1) int main(int argc, char *argv[]) { // création de la JVM JNIEnv* env = CppToJava(pathJVM, pathUser, true); // lecture de la classe Java « Exo1.class » du cours 1 jclass cls = env->FindClass("cours1/exo1"); // recherche de la méthode d’entrée main() jmethodID mid = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V"); // Lecture de la classe « java.lang.String » jclass stringClass = env->FindClass("java/lang/String");
34
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 34 1.2.1. APPEL DE LA JVM EN C++ Exemple - exo5.cpp (2) // Création de l’objet « args », instance de la classe String jstring jstr; jobjectArray args = env->NewObjectArray(1, stringClass, jstr); // Appel de méthode main(args) de la classe Exo1 env->CallStaticVoidMethod(cls, mid, args); // Destruction de la JVM CppToJava(pathJVM, pathUser, false); }
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.