Comment? C.S.Horstmann & G.Cornell, Campus Press, Pearson Education, F. Mallet EPU Électronique

Documents pareils
Cours Java Native Interface

Programmation avancée et répartie en Java : interfaçage avec d autres langages

Systeme d'exploitation

Derrière toi Une machine virtuelle!

Généralités sur le Langage Java et éléments syntaxiques.

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Une introduction à Java

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Plan du cours. Historique du langage Nouveautés de Java 7

RAPPORT DE STAGE. Licence Professionnelle Systèmes Informatiques et Logiciels spécialité Imagerie Numérique et Informatique

Introduction au langage C

Premiers Pas en Programmation Objet : les Classes et les Objets

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Programmer en JAVA. par Tama

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Cours 1: Java et les objets

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

as Architecture des Systèmes d Information

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Héritage presque multiple en Java (1/2)

Le langage C. Séance n 4

Utiliser Java sans BlueJ

INITIATION AU LANGAGE JAVA

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

Institut Supérieure Aux Etudes Technologiques De Nabeul. Département Informatique

Java Licence Professionnelle CISII,

Java - la plateforme

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Java Licence Professionnelle CISII,

Remote Method Invocation (RMI)

Quelques éléments de compilation en C et makefiles

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Cours 14 Les fichiers

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Corrigé des exercices sur les références

Bases du langage. Historique Applications et applets Éléments de base du langage Classes et objets Les exceptions

Initiation à JAVA et à la programmation objet.

Notions fondamentales du langage C# Version 1.0

RN2-Programmation Orientée Objet - JAVA CH 1 Introduction à la POO et Java

Machines Virtuelles. et bazard autour. Rémi Forax


Java c est quoi? Java pourquoi?

Programmation Bas Niveau

Introduction à l héritage en C++

La JVM. La machine virtuelle Java. La JVM. La JVM

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

F. Barthélemy. 17 mai 2005

Bases Java - Eclipse / Netbeans

Cours Langage C/C++ Programmation modulaire

RMI le langage Java XII-1 JMF

Utilisation d objets : String et ArrayList

1 Définition et Appel d une fonction. V. Phan Luong. Cours 4 : Fonctions

Java Avancé. Le langage Java. Rémi Forax

Tp 1 correction. Structures de données (IF2)

Chapitre VI- La validation de la composition.

Programmation Orientée Objet Java

Étude de l interopérabilité de deux langages de programmation basée sur la machine virtuelle de Java

Algorithmique & Langage C IUT GEII S1. Notes de cours (première partie) cours_algo_lgc1.17.odp. Licence

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Programmation système I Les entrées/sorties

Langage Java. Classe de première SI

Package Java.util Classe générique

Programmation en Java IUT GEII (MC-II1) 1

Programmation Objet Java Correction

Présentation de Java. Olivier de Pertat IT GROUP

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

TP1. Outils Java Eléments de correction

Java Licence professionnelle CISII,

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Chapitre 2. Classes et objets

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

TD/TP PAC - Programmation n 3

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

TD/TP PAC - Programmation n 3

Java 1.5 : principales nouveautés

Module.NET 3 Les Assemblys.NET

TP réseaux 4 : Installation et configuration d'un serveur Web Apache

Structure d un programme

Introduction aux Machines Virtuelles avec VMKit

ALGORITHMIQUE ET PROGRAMMATION ORIENTEE OBJET

Programmeur Java 1.4 et 5.0

I. Introduction aux fonctions : les fonctions standards

Rappels Entrées -Sorties

Intergiciels pour la répartition CORBA : Common Object Request Broker. Patrice Torguet torguet@irit.fr Université Paul Sabatier

JAVA TD0. Prise en main du langage Environnement de base JAVA 1

Programmation par les Objets en Java

TP, première séquence d exercices.

Cours d initiation à la programmation en C++ Johann Cuenin

ETUDE DE CAS en UML : GESTION DES COMMANDES DE PIECES FABRIQUEES PAR LA SOCIETE C

Transcription:

The Java Native Interface (JNI) Exécuter du code écrit dans un autre langage (C/C++) Pourquoi? Comment? Un exemple Au coeur de Java 2 : Fonctions avancées,, C.S.Horstmann & G.Cornell, Campus Press, Pearson Education, 2002 6-1

Pourquoi? On dispose de beaucoup de code non java On veut le réutiliser Les transformations automatiques sont impossibles On ne veut pas le «porter» à la main Accès à des unités ou fonctions systèmes Fastidieux (java.lang.system) ou impossible en java e.g., Ports série ou parallèle, etc. La vitesse d'exécution est déterminante On veut écrire des bouts en assembleur/c/c++ Peu plausible avec les performances de JIT et HotSpot Goulot d'étranglement souvent ailleurs (e.g., (eg E/S, réseau) 6-2

Mises En Garde Perte de portabilité Il faut fournir des bibliothèques partagées pour chaque plate-forme ainsi ique des instructions i pour l'installation ll i Problèmes de sécurité Pas de protection par la sandbox java Il est facile d'écrire du code C/C++ qui corrompt la machine virtuelle java C, C++ ou autre La liaison i avec n'importe quel llangage est possible JNI ne supporte que le lien avec C 6-3

Comment? Appeler une fonction C/C++ à partir du code java Écrire le code java et le compiler : mot clé native Générer un fichier.h : javah Écrire l'implémentation native en C/C++ Créer une bibliothèque partagée (e.g., DLL) Exécuter le programme java qui utilise la bibliothèque Appeler du code java à partir de C/C++ Invoquer la machine virtuelle Compiler le Java en code natif (e.g., gcj) 6-4

Écrire Le Code Java Les méthodes natives sont précédées du mot clé native La méthode statique loadlibrary de la classe System Permet le chargement de bibliothèques partagées System.loadLibrary("essai"); i") Charge essai.dll sous Windows, libessai.so sous Unix A quel moment utiliser cette instruction? Constructeur? Méthode? Les blocs statiques sont des blocs exécutés lorsque la classe à laquelle ll ils appartiennent est chargée par le ClassLoader. C'est le seul code en dehors d'une méthode. 6-5

Exemple public class Exemple { static { } System.loadLibrary("essai"); } int etat = 0 ; public int add(int x, int y) { return x + y + etat ; } public native void message(); La méthode message doit être définie dans essai.dll Pas de restrictions sur la signature Java de message statique ou non, publique ou non, avec ou sans paramètres 6-6

Compilation et Exécution Ce code Java compile javac ac Exemple.java a Produit le fichier Exemple.class La classe Exemple est utilisée normalement Lors de l'exécution Erreur de lien si essai.dll n'est pas trouvé Exception in thread "main" java.lang.unsatisfiedlinkerror: no essai in java.library.path at java.lang.classloader.loadlibrary(unknown Source) at java.lang.runtime.loadlibrary0(unknown loadlibrary0(unknown Source) at java.lang.system.loadlibrary(unknown Source) at Exemple.<clinit>(Exemple.java:3) 6-7

La signature C de message void Java_Exemple_message(JNIEnv *, jobject); Utiliser le nom complet de la méthode : Exemple.message Si la classe appartient à un paquetage, ajouter son nom Transformer les caractères non ASCII ('_', '$', etc.) par _0xxxx où xxxx est l'unicode en hexadécimal Remplacer les points ''par. des soulignés '_' Exemple_message Faire précéder de Java_ Méthodes d statiques ti : jobject est remplacé par jclass Le jobject passé en paramètre représente this 6-8

L'outil javah Transformation automatique : javah Exemple Génère le fichier Exemple.h #include <jni.h> #ifndef _Included_Exemple #define _Included_Exemple #ifdef cplusplus extern "C" { #endif JNIEXPORT void JNICALL Java_Exemple_message (JNIEnv*, jobject); #ifdef } #endif #endif cplusplus 6-9

Paramètres et type de retour En C, les types (int, long) dépendent du compilateur JNI définit des types C équivalents aux types Java Langage Java Langage C Octets boolean jboolean 1 byte jbyte 1 char jchar 2 short jshort 2 int jint 4 long jlong 8 float jfloat 4 double jdouble 8 void void JNI_TRUE=1 JNI_FALSE=0 6-10

Exemple avec des paramètres La méthode print de la classe mypackage.exemple public native int print(int, int, double); Devient en C jint Java_mypackage_Exemple_print(JNIEnv print(jnienv *, jobject, jint, jint, jdouble); Les types JNIEnv, jobject, jint sont définis dans jni.h L'équivalence n'est possible qu'avec les types de base Sinon : jstring, jobject, jarray, jthrowable, etc. Pas de vérification i stricte de type (pas du C++) 6-11

Notes personnelles 6-12

Les chaînes de caractères jstring 6-13

Utiliser des jstring en C Calculer la taille : jsize GetStringLength(JNIEnv* e, jstring s); Manipuler les caractères : tableau de jchar const jchar * GetStringChars(JNIEnv* env, jstring s, jboolean *iscopy); On peut utiliser ce tableau, il ne faut pas le modifier (const) le compilateur C ne vérifie pas les const iscopy vaut JNI_TRUE si le tableau est une copie Avertir le garbage g collector qu'on n'utilise plus le jstring void ReleaseStringChars(JNIEnv* e, jstring s, const jchar []c); 6-14

Créer des jstring jstring NewString(JNIEnv*, const jchar[], jsize); Le tableau de jchar peut être désalloué (e.g. mémoire statique) La méthode renvoie NULL si la création est impossible 2 utilisations équivalentes (traduction inline) A la C : (*env)->getstringlength(env, s); A la C++ : env->getstringlength(s); 6-15

UTF et unicode Les méthodes présentées fonctionnent avec des tableaux de jchar : unicode Si on utilise des tableaux d'octets (jbyte) alors : GetStringUTFLength GetStringUTFChars ReleaseStringUTFChars NewStringUTF 6-16

Les objets jobject 6-17

Lecture et modification des attributs Lecture jint GetIntField(JNIENV*, jobject, jfieldid) ; jint GetStaticIntField(JNIENV*, ti tfi jclass,jfieldid); jfi ldid) Modification SetIntField(JNIENV*, jobject, jfieldid, jint) ; SetStaticIntField(JNIENV*, jclass,jfieldid,jint); Généralisationé i Il faut remplacer Int/jint par le type adéquat Boolean/jboolean, Byte/jbyte, Char/jchar, Short/jshort, Long/jlong, Float/jfloat, Double/jdouble, Object/jobject j j 6-18

Les identificateurs d'attributs jfieldid GetFieldID(JNIEnv *env, jclass cl, const char nom[], const char sig[]); jfieldid GetStaticFieldID(JNIEnv *env, jclass cl, const char nom[], const char sig[]); La signature textuelle t d'un attribut t est codée par B(byte), C(char), D(double), F(float), I(int), J(long), S(short), V (void), Z (boolean), LnomClasse; (classe), [ (tableau) [[F code le type float [][] [Ljava/lang/String; code String[] Pour connaître la signature on peut utiliser javap -s 6-19

Notes personnelles 6-20

jclass Les identificateurs s'obtiennent à partir de la jclass Pour les méthodes statiques la jclass est disponible directement Pour les méthode d'instances on a un jobject jclass GetObjectClass(JNIENV ( *, jobject); j On peut trouver la jclass à partir du nom de la classe jclass FindClass(JNIENV *, const char []); e.g. (*env)->findclass(env, ( java/lang/string ); g 6-21

Invoquer une méthode java Methodes thd d'instances xxx CallXXXMethod(JNIENV*, jobject, jmethodid,...) ; Méthodes statiques xxx CallStaticXXXMethod(JNIENV*, jclass, jmethodid,...) ; Comme pour les attributs, le XXX/xxx doit être remplacé en fonction du type de retour de la méthode concernée eg e.g. CallVoidMethod si pas de retour, CallIntMethod si le type de retour est jint 6-22

Les identificateurs de méthodes jmethodid GetMethodID(JNIEnv *env, jclass cl, const char nom[], const char sig[]); jmethodid GetStaticMethodID(JNIEnv *env, jclass cl, const char nom[], const char sig[]); La signature textuelle d'une méthode est codée : double add(int, float) par (IF)D void print(string, short[]) par (Ljava/lang/String;[S)V Comme pour les attributs on peut utiliser javap -s 6-23

javap s Exemple Compiled from "Exemple.java" public class Exemple extends java.lang.object{ int etat; Signature: I public Exemple(); Signature: ()V public int add(int,int); Signature: (II)I public native void message(); Signature: ()V static {}; Signature: ()V } 6-24

Invoquer un constructeur jobject NewObject(JNIENV*, jclass, jmethodid,...) ; La signature textuelle d'un constructeur est obtenue comme pour une méthode qui retourne void 6-25

Les tableaux - jarray Type Java Type C boolean [] jbooleanarray byte[] jbytearray y char[] jchararray int[] jintarray short[] jshortarray long[] jlongarray float[] jfloatarray double[] jdoublearray Object[] jobjectarray j En C, tous ces types sont synonymes de jarray En C++, une hiérarchie de classes est conservée 6-26

Utiliser en C des tableaux Java Connaître sa taille jint getarraylength(jnienv*, jarray); Pour les tableaux d'objets, on accède aux éléments 1 à 1 jobject getobjectarrayelement(jnienv *, jobjectarray, jsize); setobjectarrayelement(jnienv *, jobjectarray, jsize, jobject); j 6-27

Notes personnelles 6-28

Pour les autres tableaux On récupère un pointeur sur le premier élément xxx* GetXXXArrayElements(JNIENV*, jxxxarray, jboolean *iscopy); iscopy = JNI_TRUE si une copie est effectuée On autorise le ramasse miettes à libérer la mémoire ReleaseXXXArrayElements(JNIENV *, jxxxarray, jint mode); mode = 0 : libère et met à jour le tableau Java mode = JNI_COMMIT : ne libère pas, mais met à jour mode = JNI_ABORT : libère et ne met pas à jour 6-29

Références locales et globales Lors de l'appel l d'une méthode native des références locales sont créées par défaut e.g. jclass, jobject, jfieldid, jmethodid, jarray,... Ces références ne sont plus valides après l'appel de la méthode, on NE DOIT PAS les stocker pour les utiliser plus tard On peut en revanche demander la création et la destruction de références globales clsglob = (*env)->newglobalref(env, cls); (*env)->deleteglobalref(env, cls); 6-30

Compilation du code C Avec VisualC++ sous Windows (vcvars32.bat): cl -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32 -LD Exemple.c -o essai.dll Avec gcc sous Linux gcc -c -fpic -I$JAVA_HOME\include -I$JAVA_HOME\include\linux Exemple.c gcc -shared -o libessai.so Exemple.o Avec cygwin ou MinGW sous Windows gcc -c -I$JAVA_HOME\include -I$JAVA_ HOME\include\win32 Exemple.c dllwrap -add-stdcall-alias -o essai.dll Exemple.o 6-31

Fichier objet Compilation Sous MAC sans XCode cc -c I/System/Library/Frameworks/JavaVM.framework/Headers Exemple.c Bibliothèque dynamique (libxxx.jnilib) cc dynamiclib -o libessai.jnilib Exemple.o framework JavaVM 6-32