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

Slides:



Advertisements
Présentations similaires
Cours n° 4 Objets, classes, interfaces et héritage
Advertisements

A RECUPERER EN ENTRANT Le polycopié de Caml Partie 1
Cours n° 1 Présentation du langage C++
Cours n° 2 Les entrées-sorties Biliothèque C++ (iostream) –
Cours n° 7 Standard Template Library II.
Cours n° 6 Standard Template Library I.
C++ 6ème cours Patrick Reuter maître de conférences
Spécialisation/généralisation Héritage Polymorphisme
Le mécanisme des exceptions
Introspection et Réflexion Manipulation dynamique de code Java.
Classe : …………… Nom : …………………………………… Date : ………………..
SI3 MAM3 Hydro Nathan Cohen Igor Litovsky Christophe Papazian
Introduction à la Programmation Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
Cours MIAGE « Architectures Orientées Services » Henry Boccon-Gibod 1 Architectures Orientées Services Composants de Service Exemple pratique de développement.
Cours n° 8 Conception et Programmation à Objets
Cours n°2M2. IST-IE (S. Sidhom) UE 303 Promo. M2 IST-IE 2005/06 Conception dun système d'information multimédia Architecture trois-tiers : PHP/MySQL &
Programmer en JAVA par Tama
LICENCE MIAGE Introduction Programmation Orientée Objet JAVA philippe
JAV - TD 6 Structures de données JAVA
TD 1 IJA Introduction Objet, méthode, attribut Classe, instance
ESIEE Paris © Denis BUREAU I N Initiation à la programmation avec le langage Java.
1 Une introduction à Java IFT 287 (Semaine 1). 2 Java - Historique Développé par Sun Microsystems en 1994 –Inventeur James Gosling (canadien!) Objectif.
Programmation orientée objet
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
Langage Oriente Objet Cours 4.
1 Les pointeurs et quelques rappels sur certains éléments du langage C.
© 2007 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java et les Exceptions Peter Van Roy Département dIngénierie Informatique,
77 Utilisation des classes (suite). 7-2 Objectifs A la fin de ce cours, vous serez capables de : Définir des méthodes surchargées dans une classe Fournir.
Introduction à la programmation (Java)
F Copyright © Oracle Corporation, Tous droits réservés. Créer des programmes avec Procedure Builder.
Langage Oriente Objet Cours 2.
66 Utilisation des classes et des objets. 6-2 Objectifs A la fin de ce cours, vous serez capables de : Créer de nouvelles classes à laide de Eclipse Utiliser.
Introduction à la Programmation Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
GPA789 Analyse et conception orientées objet 1 Professeur: Tony Wong, Ph.D., ing. Chapitre 6 Correspondance UML et C++
Programmation concurrente
POO-L3 H. Fauconnier1 Supplément gratuit…. POO-L3 H. Fauconnier2 Entrée-sortie public static void main(String[] args) { // sortie avec printf ou double.
IFT 6800 Atelier en Technologies d’information
1 Les paquetages («packages»). 2 L'objectif avec les paquetages («packages») est de rendre accessibles aux utilisateurs des classes définies par d'autres.
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
LIFI-Java 2004 Séance du Jeudi 9 sept. Cours 1. La notion de langage Décrire une tâche à effectuer –programme Écrire à un haut niveau –facile pour lutilisateur.
Types de données abstrait et mécanismes d'encapsulation
COURS DE PROGRAMMATION ORIENTEE OBJET :
COURS DE PROGRAMMATION ORIENTEE OBJET :
Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure dInformatique (ESI) Plate-forme.NET.
CSI 1502 Principes fondamentaux de conception de logiciels
Java, les objets : tout de suite ! Rassembler, grouper les objets
Cours Java Native Interface
Proxy et plus Cnam Paris jean-michel Douin, douin au cnam point fr
Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 1 Cours n° 4 Polymorphisme II.
Une introduction à Java
Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 1 Cours n° 9 Interopérabilité logicielle I Entre C++
Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 1 Cours n° 3 Polymorphisme I.
Structures des données
2.1 - Historique Chapitre 2 : Introduction au langage C++
LES PILES ET FILES.
Cours n°3 rappels. POO-L3 H. Fauconnier2 Entrée-sortie public static void main(String[] args) { // sortie avec printf ou double a = 5.6d ; double b =
Cours 1 1 Java. Cours 1 2 Plan général 1.Introduction 2.Les types primitifs, évaluation d’expressions 3.Instructions for, if…. 4.Introduction de l’objet,
La notion de type revisitée en POO
Cours n° 1 Présentation du langage C++
Masters IIGLI et ILGII – Intranet internet extranet – – Claude Montacié 1 Cours n° 10 Accès distant aux bases de données.
© 2005 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java Peter Van Roy Département d’Ingénierie Informatique, UCL
Tutorat en bio-informatique
Les classes et les objets Les données finales class A { … private final int n = 20 ; // la valeur de n est définie dans sa déclaration … } class A { public.
Les surcharges d'opérateurs
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
Héritage Conception par Objet et programmation Java
pour les programmeurs en C++ Java 2 Part 1 3 Histoire de Java Projet de connexion des machines: 1991 Le nom Java a été introduit dans un café Développé.
BlueJ_III 1 Java, les objets : tout de suite ! Interaction entre objets Notes de cours associées au chapitre 3 tutorial BlueJ
Transcription de la présentation:

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

Masters IIGLI et IGLII – Programmation générique et conception objet – – 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 – – 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

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 4 1. JAVA NATIVE INTERFACE Principes

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 5 1. JAVA NATIVE INTERFACE Bibliographie La programmation Sheng Liang, «Java(TM) Native Interface: Programmer's Guide and Specification », Addison-Wesley, La bible Rob Gordon, «Essential JNI : Java Native Interface», Prentice All, Sites sunsite.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 – – Claude Montacié 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++)

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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)]

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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(); }

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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); }

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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; }

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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++

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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)); }

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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); }

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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() = 12

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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); }

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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);

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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);

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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); }

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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; }

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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()); }

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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; }

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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(); }

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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); }

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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);

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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); }

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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,

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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");

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 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); }