Cours Java Native Interface



Documents pareils
Systeme d'exploitation

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

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

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Derrière toi Une machine virtuelle!

Une introduction à Java

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

as Architecture des Systèmes d Information

Programmer en JAVA. par Tama

Synchro et Threads Java TM

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

Cours 1: Java et les objets

Java Licence Professionnelle CISII,

La carte à puce. Jean-Philippe Babau

Chapitre 10. Les interfaces Comparable et Comparator 1

INITIATION AU LANGAGE JAVA

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

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

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

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

Remote Method Invocation Les classes implémentant Serializable

Threads. Threads. USTL routier 1

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

Java Licence Professionnelle CISII,

Package Java.util Classe générique

PROGRAMMATION PAR OBJETS

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

Présentation de Java. Olivier de Pertat IT GROUP

Initiation à JAVA et à la programmation objet.

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

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

RMI le langage Java XII-1 JMF

Programmation par les Objets en Java

Java c est quoi? Java. Java. Java : Principe de fonctionnement 31/01/ Vue générale 2 - Mon premier programme 3 - Types de Programme Java

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Calcul Parallèle. Cours 5 - JAVA RMI

Remote Method Invocation (RMI)

Chapitre I Notions de base et outils de travail

Corrigés des premiers exercices sur les classes

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

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

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

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

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

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

Introduction au langage C

Traitement de données

TP1 : Initiation à Java et Eclipse

Introduction au langage Java

La technologie Java Card TM

Corrigé des exercices sur les références

Introduction : les processus. Introduction : les threads. Plan

Programmation système I Les entrées/sorties

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

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

Java 1.5 : principales nouveautés

Langage Java. Classe de première SI

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

Apprendre la Programmation Orientée Objet avec le langage Java (avec exercices pratiques et corrigés)

Projet gestion d'objets dupliqués

Premiers Pas en Programmation Objet : les Classes et les Objets

Utiliser Java sans BlueJ

Applet pour visualiser les variables «automate» notifiées

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

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

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Java c est quoi? Java pourquoi?

Introduction à la programmation concurrente

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

Dis papa, c est quoi un bus logiciel réparti?

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

F. Barthélemy. 17 mai 2005

Java DataBaseConnectivity

Java - la plateforme

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

Auto-évaluation Programmation en Java

JAVA. Introduction à la programmation objet avec java 1/4. Nadir BOUSSOUKAIA

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

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

TP1. Outils Java Eléments de correction

Introduction aux Machines Virtuelles avec VMKit

INF 321 : mémento de la syntaxe de Java

Programmation Bas Niveau

[APPLICATON REPARTIE DE VENTE AUX ENCHERES]

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

Programmation Objet Java Correction

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Remote Method Invocation en Java (RMI)

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

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

Objets et Programmation. origine des langages orientés-objet

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

TD2 Programmation concurrentielle

1 Définition d une classe en Java

Programmation en Java IUT GEII (MC-II1) 1

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Bases Java - Eclipse / Netbeans

Un ordonnanceur stupide

Généricité. en Java. (polymorphisme paramétrique) Philippe GENOUD UJF Janvier

27/11/12 Nature. SDK Python et Java pour le développement de services ACCORD Module(s)

Transcription:

Cours Java Native Interface 1999, Cnam Paris jean-michel Douin, douin@cnam.fr Version du 28 Mars 2002 http://lmi92.cnam.fr:8080/tp_cdi/{douin/ Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java 1

Sommaire De Java vers C/C++ De C/C++ vers Java lecture/écriture de données d'instance et de classes invocation de méthodes d'instance et de classes création d'objet création de tableaux et de String Levée et filtrage d'exceptions utilisation des moniteurs (de hoare) Entrées/sorties Série création de machine(s) Java API JNI // Architecture de la machine virtuelle Ces notes sont accessibles : http://lmi92.cnam.fr/tp_cdi/java_jni.pdf 2

Bibliographie utilisée Le tutorial JNI de Beth Stearns http://java.sun.com/docs/books/tutorial/index.html surtout : http://java.sun.com/docs/books/tutorial/native1.1/index.html jni specification : http://java.sun.com/products/jdk/1.1/download-pdf-ps.html Un «essentiel» ouvrage sur le sujet Essential JNI: Java Native Interface, rob Gordon, Prentice hall.1998 ISBN 0-13-679895-0 le site de l éditeur http://www.phptr.com/ les instructions et l architecture de la machine virtuelle Java reflètent les fonctionnalités de cette API The VM specification.http://java.sun.com/docs/books/vmspec/html 3

JNI Pourquoi? Applications existantes dans un environnement Java, avec ou sans les sources Programmation d un périphérique, logiciel de base, Entrées/Sorties, Cartes d acquisition, de commandes (Adressage physique, Accès au matériel, aux pilotes de la carte, interruptions Développement en C/C++, tout en bénéficiant de l environnement Java IHM en Java, application en C, Applet, accès à l internet Code Natif pour de meilleures performances en temps d exécution Portabilité est annulée, dépendant de la plate-forme, moindres robustesse et sécurité 4

JNI Présentation Deux aspects de Java vers C/C++ de C/C++ vers Java en venant de Java ou depuis une application ordinaire L API JNI offre l accès à la machine virtuelle accès aux variables d instance, appel de méthodes, chargement d une classe, création d instances Mécanisme de bas-niveau... Exceptions, Threads. 5

De Java vers C(jc) 1) usage du mot clé native 2) génération par les outils de SUN de l interface «.h» >javah -jni Exemple 3) génération de la DLL (Win32,.dll), ou de la SOL(solaris,.so) 4) exécution nécessite l accès à $JDK_HOME\include et en fonction de la plate-forme $JDK_HOME\include\win32 (ou solaris) 6

jc) 1) Le source Java public class JavaVersC { public native void bonjour(); // (1) public static void main(string args[]) { new JavaVersC().bonjour(); static{ System.loadLibrary("JavaVersC"); // (2) >javac JavaVersC.java (1) emploi de native (2) chargement de la librairie (DLL/sol) dans laquelle sera implémentée le code C de bonjour 7

jc) Le source C : interface 2) génération de l interface (.h) par javah >javah -jni JavaVersC /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class JavaVersC */ #ifndef _Included_JavaVersC #define _Included_JavaVersC #ifdef cplusplus extern "C" { #endif /* Class: JavaVersC * Method: bonjour * Signature: ()V */ JNIEXPORT void JNICALL Java_JavaVersC_bonjour(JNIEnv *, jobject); #ifdef cplusplus #endif #endif 8

jc) le source C : Implémentation #include <stdio.h> #include "JavaVersC.h" JNIEXPORT void JNICALL Java_JavaVersC_bonjour (JNIEnv *env, jobject j){ printf("java_javaversc_bonjour"); 3) Génération de la DLL, (JavaVersC.dll) Avec visual c++ cl -Ic:\jdk\include -Ic:\jdk\include\win32 -LD JavaVersC.c -FeJavaVersC.dll 4) Exécution par >java JavaVersC 9

JNIEnv *env jc) JNIENV et jobject Il s agit de l environnement de la machine Java associé au «Thread» courant, (le Thread ayant engendré l appel de la méthode native bonjour) jobject j Il s agit de l objet receveur du message bonjour(), ici l instance créée dans la méthode main En résumé A chaque appel d une méthode native sont transmis par la machine Java un environnement l objet receveur ou la classe si c'est une méthode classe et éventuellement les paramètres 10

De C vers Java(cj) depuis une DLL/SO engendrée par javah emploi du mot clé native java -----native----------->c/c++ java <----API_JNI--------- C/C++ ou depuis une application C/C++ ordinaire java <----API_JNI--------- C/C++ 11

cj) De C vers Java Primitives d accès à la machine Java env j Variables d instance Source C <jni.h> Byte code Méthodes d instances méthodes de classe class Variables de classe 12

Fonctions de JNI Versions Opérations sur les classes Exceptions Références locales et globales Opérations sur les objets Accès aux champs des objets Appels de méthodes d'instances Accès aux champs statiques Appels de méthodes de classes Opérations sur les instances de type String Opérations sur les tableaux Accès aux moniteurs Interface de la JVM 13

cj) Accès aux Variables d'instance GetFieldID, Get<type>Field, Set<type>Field public class Exemple{ private int x; public native void setx(int val); x obj Variables d instance En C : JNIEXPORT void JNICALL Java_Exemple_setX (JNIENV *env, jobject obj, jint val){ jclass classe = (*env)->getobjectclass(env,obj); jfieldid fid = (*env)->getfieldid(env,classe,"x","i"); (*env)->setintfield(env,obj,fid,val) ; instructions JVM : getfield, putfield 14

Exemple.java au complet public class Exemple{ private int x; public native void setx(int val); static{ System.loadLibrary("Exemple"); public static void main(string args[]) { Exemple e = new Exemple(); e.setx(33); System.out.println(" dites " + e.x); 15

Exemple.c au complet #include "Exemple.h" JNIEXPORT void JNICALL Java_Exemple_setX(JNIEnv* env, jobject obj, jint val){ jclass cl = (*env)->getobjectclass(env,obj); jfieldid fid = (*env)->getfieldid(env,cl,"x","i"); (*env)->setintfield(env,obj,fid,val) ; 16

Les commandes Win32 au complet javac -classpath. Exemple.java javah -jni -classpath. Exemple cl /Ic:\jdk\include /Ic:\jdk\include\win32 /LD Exemple.c /FeExemple.dll java -cp. Exemple 17

Retour sur JNIENV *env env GetFieldID SetIntField GetObjectClass etc... en C : (*env)->getfieldid(env,...) en C++ : env->getfieldid(...) etc... 18

JNIENV *env Inspiré du JRI de Netscape Chaque fonction est accessible par un déplacement fixe dans une table, Une table peut donc être substituée par une autre sans avoir à recompiler, L'implantation des fonctions de cette table est à la charge du fournisseur de la JVM, Le code C/C++ d'accès à la JVM devient portable Analogue à l'implémentation de la table des méthodes virtuelles d'une instance 19

cj) Accès aux Variables de classes GetStaticFieldID, GetStatic<type>Field, SetStatic<type>Field public class Exemple{ private static int x; public native setstaticx(int val); x classe Variables de classe JNIEXPORT void JNICALL Java_Exemple_setStaticX (JNIENV *env, jobject obj, jint val){ jclass classe = (*env)->getobjectclass(env,obj); jfieldid fid = (*env)->getstaticfieldid(env,classe,"x","i"); (*env)->setstaticintfield(env,classe,fid,val) ; instructions JVM : getstatic, putstatic 20

cj) Appels de méthodes d instance Call<type>Method obj public class Exemple{ public void p(){system.out.println( "appel de p "); public native callp(int val); table des méthodes JNIEXPORT void JNICALL Java_Exemple_callP (JNIENV *env, jobject obj){ jclass classe = (*env)->getobjectclass(env,obj); jmethodid mid = (*env)->getmethodid(env,classe,"p","()v"); (*env)->callvoidmethod(env,obj,mid) ; instruction JVM : invokevirtual 21

cj) Appels de méthodes de classe CallStatic<type>Method classe public class Exemple{ public static void p(){system.out.println( "appel de p "); public native callp(int val); table des méthodes de classe JNIEXPORT void JNICALL Java_Exemple_callP (JNIENV *env, jobject obj){ jclass classe = (*env)->getobjectclass(env,obj); jmethodid mid = (*env)->getstaticmethodid(env, classe,"p", "()V"); (*env)->callstaticvoidmethod(env, classe,mid) ; instruction JVM : invokestatic 22

cj) Types natifs jni.h, interpreter.h,oobj.h,typecodes.h Types natifs / types java jbyte / byte, jshort / short, jint / int. jobject / Object, jclass / Class, jstring / String, jarray / array, jthrowable / Throwable sur la palte-forme Win32 nous avons typedef jijnt long; 23

Signature des méthodes FieldType ::= BaseType ObjectType ArrayType BaseType B byte C char D double F float I int J long S short Z boolean ObjectType L<classname>; ArrayType [ table MethodDescriptor ::= ( FieldType *) ReturnDescriptor ReturnDescriptor ::= FieldType V V si le type retourné est void 24

Signature des méthodes en "clair" >javap -s -private JavaVersC Compiled from JavaVersC.java public synchronized class JavaVersC extends java.lang.object /* ACC_SUPER bit set */ { public native void bonjour(); /* ()V */ public static void main(java.lang.string[]); /* ([Ljava/lang/String;)V */ public JavaVersC(); /* ()V */ static static {; /* ()V */ 25

Objets et classe NewObject, NewObjectA,NewObjectV création d une instance obtention de la classe obtention du constructeur passage des paramètres et création...//en Java : ClasseA newobj = new ClasseA(10,"hello"); jclass classe = (*env)->findclass("classea"); jmethodid mid = (*env)->getmethodid(classe, "<init>", "(ILjava/lang/String;)V"); jint val = 10; jstring str = (*env)->newstringutf(env, "hello"); jobject newobj = (*env)->newobject(env, classe,mid,val,str) ; instruction JVM : new et invokespecial 26

instanceof IsInstanceOf class A{ class B extends A{void callp(boolean b){ ;...// obj est de classe déclarée A mais constatée B jclass classeb = (*env)->findclass("b"); if ((*env)->isinstanceof(obj,classeb)){ jmethodid mid = (*env)->getmethodid(classeb, "callp", "(Z)V"); jbool val = JNI_TRUE; (*env)->callvoidmethod(obj,mid,val) ; instruction JVM : instanceof, (checkcast) 27

Tableaux et String NewObjectArray, public class Exemple{ public void p(){string sa = newarray(10); public native String [] newarray(int taille);... jclass classe = (*env)->findclass(env, "java/lang/string"); jobjectarray newarr = (*env)->newobjectarray(env, taille,classe,null); for(int i = 0; i< taille; i++){ str = (*env)->newstringutf("hello"); (*env)->setobjectarrayelement(env, newarr,i,str); (*env)->deletelocalref(env, str); return newarr; DeleteLocalRef -> str a 2 références, en jni et en java (gc) instruction JVM : newarray 28

Objets et ramasse miettes Chaque objet crée par JNI ne peut être collecté par le ramasse miettes Java, (l'objet str est référencé dans la machine Java) DeleteLocalRef(str) // de l'exemple précédent permet de libérér cet objet (autorise la récupération mémoire par le ramasse miettes) NewGlobalRef(obj); "bloque" l'objet en mémoire 29

Levée d exceptions ThrowNew, ExceptionClear, ExceptionOccured, ExceptionDescribe... jclass classeexc = (*env)->findclass("java/lang/outofmemoryerror");... if (Condition){ (*env)->thrownew(classeexc,"outofmemoryerror"); printf("apres le traitement de l'exception en Java...");... instruction JVM : athrow 30

Monitor MonitorEnter, MonitorExit // l'équivalent de l'instruction synchronized (*env)->monitorenter(env,obj); //du code C/C++ (*env)->monitorexit(env,obj); instructions JVM : monitorenter, monitorexit Appels de wait et notify par les primitives GetMethodID et CallVoidMethod jclass classe = (*env)->getobjectclass(env,obj); jmethodid waitmid = (*env)->getmethodid(env,classe,"wait","()v"); (*env)->callvoidmethod(env,obj,waitmid); if((*env)->exceptionoccured()!=null)) // une exception est générée en Java, mauvais usage de Wait... 31

Deux exemples Entrées/Sorties Voie Série Accès au «Windows Registry» 32

Entrées/Sorties Voie Série Win32Port Markus Bauer, (disponible sur http://java.cnam.fr) public class Win32Port{ public native boolean open(int pnr, String par, boolean handshake); public native void clear(int pnr); public native void settimeout(int pnr, int tout); public native int getbyte(int pnr); public native int getbytes(int pnr, byte[] bytes); public native boolean putbyte(int pnr, int b); public native int putbytes(int pnr, byte[] bytes); public native boolean close(int pnr); static { System.loadLibrary("portcom"); 33

Accès à la base de registres sous Windows http://www.emunix.emich.edu/~evett/programminglanguages/core/v2ch11/win32regk eytest/ Un lien à suivre et à mettre en Oeuvre 34

Appel de la machine Java le source C ordinaire utilisation de javai.lib chargement et appel de la machine Java depuis le point d'entrée main le source Java ordinaire n'importe quelle application 35

Le source C #include <jni.h> int main(int argc, char *argv[]){ // declarations ici options[0].optionstring = "-Djava.class.path=."; memset(&vm_args, 0, sizeof(vm_args)); vm_args.version = JNI_VERSION_1_2; vm_args.noptions = 1; vm_args.options = options; res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); res = JNI_CreateJavaVM(&jvm, &env, &vm_args); classe = (*env)->findclass(env, "CVersJava"); methodeid = (*env)->getstaticmethodid( env,classe,"main","([ljava/lang/string;)v"); jstr = (*env)->newstringutf(env," depuis du c!!!"); args = (*env)->newobjectarray( env,1,(*env)->findclass(env,"java/lang/string"),jstr); (*env)->callstaticvoidmethod(env,classe,methodeid,args); (*jvm)->destroyjavavm(jvm); return (0); 36

Le source Java public class CVersJava{ public static void main(string [] args){ System.out.println("en java dans main " + args[0]); 37

Le source Complet (1) #include <jni.h> #include <stdlib.h> int main(int argc, char *argv[]){ JNIEnv *env; JavaVM *jvm; JavaVMInitArgs vm_args; JavaVMOption options[1]; jint res; jclass classe; jmethodid methodeid; jstring jstr; jobjectarray args; char classpath[1024]; options[0].optionstring = "-Djava.class.path=."; options[1].optionstring = "-verbose:jni"; memset(&vm_args, 0, sizeof(vm_args)); vm_args.version = JNI_VERSION_1_2; vm_args.noptions = 1; vm_args.options = options; 38

Le source Complet (2) res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); if (res==jni_err){ printf(" erreur lors de la création de la JVM...\n"); return 1; classe = (*env)->findclass(env, "CVersJava"); methodeid = (*env)->getstaticmethodid( env,classe,"main","([ljava/lang/string;)v"); jstr = (*env)->newstringutf(env," depuis du c!!!"); args = (*env)->newobjectarray(env,1,(*env)->findclass(env,"java/lang/string"),jstr); (*env)->callstaticvoidmethod(env,classe,methodeid,args); (*jvm)->destroyjavavm(jvm); return (0); cl -Ic:\jdk\include -Ic:\jdk\include\win32 SimpleHttpd.c c:\jdk\lib\jvm.lib set path = c:\jdk\jre\bin\classic\;%path% accès à jvm.dll 39

Un serveur Web depuis C. res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); if (res==jni_err){ printf(" erreur lors de la création de la JVM...\n"); return 1; classe = (*env)->findclass(env, "SimpleHttpd2"); methodeid = (*env)->getstaticmethodid( env,classe,"main","([ljava/lang/string;)v"); args = (*env)->newobjectarray(env,0,(*env)>findclass(env,"java/lang/string"),null); (*env)->callstaticvoidmethod(env,classe,methodeid,args); return (0); 40

Conclusion 41