34
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Mont 1 Cours n° 10 Cours n° 10 Interopérabilité logicielle I Interopérabilité logicielle I Entre C++ et Java Entre C++ et Java

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++

Embed Size (px)

Citation preview

Page 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++

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

Page 2: 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++

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

Page 3: 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++

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

Page 4: 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++

Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié4

1. JAVA NATIVE INTERFACE1. JAVA NATIVE INTERFACE

PrincipesPrincipes

Page 5: 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++

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)

Page 6: 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++

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++)

Page 7: 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++

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

Page 8: 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++

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)]

Page 9: 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++

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

Page 10: 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++

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

Page 11: 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++

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

Page 12: 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++

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

Page 13: 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++

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();

}

}

Page 14: 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++

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);

}

Page 15: 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++

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;

}

Page 16: 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++

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++

Page 17: 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++

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));

}

}

Page 18: 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++

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);

}

Page 19: 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++

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

Page 20: 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++

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);

}

}

Page 21: 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++

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);

Page 22: 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++

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);

Page 23: 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++

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);

}

Page 24: 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++

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;

}

Page 25: 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++

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());

}

Page 26: 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++

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; }

Page 27: 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++

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();

}

Page 28: 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++

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);

}

Page 29: 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++

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);

Page 30: 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++

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);

}

Page 31: 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++

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,

Page 32: 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++

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

Page 33: 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++

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");

Page 34: 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++

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);

}