masters iigli et iglii – programmation générique et conception objet – 2005-2006 – claude...
TRANSCRIPT
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié1
Cours n° 10Cours n° 10
Interopérabilité logicielle IInteropérabilité logicielle IEntre C++ et JavaEntre C++ et Java
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
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié3
INTRODUCTIONINTRODUCTION
Programmation multilingue en Java, C++ et PerlProgrammation 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
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié4
1. JAVA NATIVE INTERFACE1. JAVA NATIVE INTERFACE
PrincipesPrincipes
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié5
1. JAVA NATIVE INTERFACE1. JAVA NATIVE INTERFACE
BibliographieBibliographie
La programmationSheng 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.
Sitessunsite.tus.ac.jp/java/docs/jdk1.1/jni.pdf (site officiel)xdprof.sourceforge.net/doxygen/structJNIEnv__.html (documentation API)
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié6
1.1. APPEL DE METHODES C++ EN JAVA1.1. APPEL DE METHODES C++ EN JAVA
PropriétésProprié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++)
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié7
1.1. APPEL DE METHODES C++ EN JAVA1.1. APPEL DE METHODES C++ EN JAVA
MéthodologieMé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
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié8
1.1. APPEL DE METHODES C++ EN JAVA1.1. APPEL DE METHODES C++ EN JAVA
Caractéristiques des méthode C++ correspondantesCaracté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)]
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié9
1.1. APPEL DE METHODES C++ EN JAVA1.1. APPEL DE METHODES C++ EN JAVA
Correspondance entre les types Java primitifs et les types JNICorrespondance entre les types Java primitifs et les types JNI
Java JNI taille en 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
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié10
1.1. APPEL DE METHODES C++ EN JAVA1.1. APPEL DE METHODES C++ EN JAVA
Correspondance avec les types Java complexesCorrespondance avec les types Java complexes
Java JNI
tout objet Java jobject
toute classe Java jclass
TableaujbyteArray, jcharArray, jshortArray,jintArray, jlongArray, jfloatArray, jdoubleArray, jbooleanArray
Tableau d’objets jobjectarray
String jstring
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié11
1.1. APPEL DE METHODES C++ EN JAVA1.1. APPEL DE METHODES C++ EN JAVA
Signature des méthodes 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
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié12
1.1. APPEL DE METHODES C++ EN JAVA1.1. APPEL DE METHODES C++ EN JAVA
Méthodes de la classe JNIEnv (496)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
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié13
1.1.1. APPEL DE METHODES C++ EN JAVA1.1.1. APPEL DE METHODES C++ EN JAVA
Exemple1 – exo1.java (pas de paramètres)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();
}
}
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié14
1.1.1. APPEL DE METHODES C++ EN JAVA1.1.1. APPEL DE METHODES C++ EN JAVA
cours4_exo1.h – void fonction1(void)cours4_exo1.h – void fonction1(void)
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
extern "C" {
/*
* Class: cours4_exo1
* Method: fonction1
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_cours4_exo1_fonction1
(JNIEnv *, jclass);
}
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié15
1.1.1. APPEL DE METHODES C++ EN JAVA1.1.1. APPEL DE METHODES C++ EN JAVA
lib1.cpp – void fonction1(void)lib1.cpp – void fonction1(void)
#include "cours4_exo1.h"
#include <iostream>
using namespace std;
JNIEXPORT void JNICALL Java_cours4_exo1_fonction1(JNIEnv *env, jclass) {
cout << "C++: Mon premier appel Java->C++" << endl;
}
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié16
1.1.1. APPEL DE METHODES C++ EN JAVA1.1.1. APPEL DE METHODES C++ EN JAVA
lib1.dlllib1.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++
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié17
1.1.2. APPEL DE METHODES C++ EN JAVA1.1.2. APPEL DE METHODES C++ EN JAVA
Exemple2 – exo2.java (paramètres de type primitifs)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));
}
}
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié18
1.1.2. APPEL DE METHODES C++ EN JAVA1.1.2. APPEL DE METHODES C++ EN JAVA
cours4_exo2.h – int fonction2(int, int)cours4_exo2.h – int fonction2(int, int)
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
extern "C" {
/*
* Class: cours4_exo2
* Method: fonction2
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_cours4_exo2_fonction2
(JNIEnv *, jclass, jint, jint);
}
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié19
1.1.2. APPEL DE METHODES C++ EN JAVA1.1.2. APPEL DE METHODES C++ EN JAVA
lib2.cpp – int fonction2(int, int)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
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié20
1.1.3. APPEL DE METHODES C++ EN JAVA1.1.3. APPEL DE METHODES C++ EN JAVA
Exemple3 – exo3.java (String, tableau, polymorphisme)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);
}
}
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié21
1.1.3. APPEL DE METHODES C++ EN JAVA1.1.3. APPEL DE METHODES C++ EN JAVA
cours4_exo3.h (1) – void Affiche(double)cours4_exo3.h (1) – void Affiche(double)
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
extern "C" {
/*
* Class: cours4_exo3
* Method: Affiche
* Signature: (D)V
*/
JNIEXPORT void JNICALL Java_cours4_exo3_Affiche__D
(JNIEnv *, jclass, jdouble);
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié22
1.1.3. APPEL DE METHODES C++ EN JAVA1.1.3. APPEL DE METHODES C++ EN JAVA
cours4_exo3.h (2) – void Affiche(string)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);
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié23
1.1.3. APPEL DE METHODES C++ EN JAVA1.1.3. APPEL DE METHODES C++ EN JAVA
cours4_exo3.h (3) – double Maximum(double[])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);
}
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié24
1.1.3. APPEL DE METHODES C++ EN JAVA1.1.3. APPEL DE METHODES C++ EN JAVA
lib3.cpp (1) – void Affiche(double)lib3.cpp (1) – void Affiche(double)
#include "cours4_exo3.h"
#include <string>
#include <vector>
#include <iostream>
using namespace std;
JNIEXPORT void JNICALL Java_cours4_exo3_Affiche__D
(JNIEnv *env, jclass, jdouble x) {
cout << x << endl;
}
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié25
1.1.3. APPEL DE METHODES C++ EN JAVA1.1.3. APPEL DE METHODES C++ EN JAVA
lib3.cpp (2) – void Affiche(string)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());
}
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié26
1.1.3. APPEL DE METHODES C++ EN JAVA1.1.3. APPEL DE METHODES C++ EN JAVA
lib3.cpp (3) – double Maximum(double[])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; }
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié27
1.1.4. APPEL DE METHODES C++ EN JAVA1.1.4. APPEL DE METHODES C++ EN JAVA
Exemple4 – exo4.java (classe Date3.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();
}
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié28
1.1.4. APPEL DE METHODES C++ EN JAVA1.1.4. APPEL DE METHODES C++ EN JAVA
cours4_Date3.h – void AccesInstance(void)cours4_Date3.h – void AccesInstance(void)
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
extern "C" {
#endif
/*
* Class: cours4_Date3
* Method: AccesInstance
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_cours4_Date3_AccesInstance
(JNIEnv *, jobject);
}
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié29
1.1.4. APPEL DE METHODES C++ EN JAVA1.1.4. APPEL DE METHODES C++ EN JAVA
lib4.cpp (1) – void AccesInstance(void) - descripteurlib4.cpp (1) – void AccesInstance(void) - descripteur
#include "cours4_Date3.h"
#include <iostream>
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);
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié30
1.1.4. APPEL DE METHODES C++ EN JAVA1.1.4. APPEL DE METHODES C++ EN JAVA
lib4.cpp (2) – void AccesInstance(void) - Accèslib4.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);
}
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié31
1.2. APPEL DE LA JVM EN C++1.2. APPEL DE LA JVM EN C++
PropriétésProprié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,
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++ 1.2.1. APPEL DE LA JVM EN C++
Création de la machine virtuelle Java (JVM) 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
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++ 1.2.1. APPEL DE LA JVM EN C++
Exemple - exo5.cpp (1)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");
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++ 1.2.1. APPEL DE LA JVM EN C++
Exemple - exo5.cpp (2)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);
}