1 / 18

Interfaçage Java et C/C++

Interfaçage Java et C/C++. Présentation de Système Ecole : Ingénieurs 2000 Filière : Informatique & Réseaux Auteur : Cyril MOQUEREAU Année : 2001/2002. Plan d’étude. Le principe de fonctionnement Prise en main Les possibilités de la JNI

mandell
Download Presentation

Interfaçage Java et C/C++

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Interfaçage Java et C/C++ Présentation de Système Ecole : Ingénieurs 2000 Filière : Informatique & Réseaux Auteur : Cyril MOQUEREAU Année : 2001/2002

  2. Plan d’étude • Le principe de fonctionnement • Prise en main • Les possibilités de la JNI • Manipulation des Strings, des tableaux, objets Java, etc... • Les limites d ’utilisation • Portabilité, Efficacité, Sécurité

  3. I. Cas d’utilisation de la JNI • Accéder aux ressources système • Utiliser du code déjà implémenté • Coder une partie critique d ’un programme

  4. Présentation d’un exemple • Les objectifs : • Interfacer un programme Java avec du code C • Décomposer la réalisation • Observer les principes de base • Les étapes de réalisation : • 1. Réalisation d’un programme Java • 2. Création du fichier de prototypage • 3. Implémentation des méthodes natives • 4. Compilation / Exécution du programme

  5. 1ère étape : Réalisation du programme Java class HelloWorld { public native void displayHelloWorld(); static { System.loadLibrary("hello"); } public static void main(String[] args) { new HelloWorld().displayHelloWorld(); } }

  6. 2ème étape (1) : Création du fichier de prototypage 1. javac HelloWorld.java 2. javah HelloWorld • /* DO NOT EDIT THIS FILE - it is machine generated */ • #include <jni.h> • /* Header for class HelloWorld */ • #ifndef _Included_HelloWorld • #define _Included_HelloWorld • #ifdef __cplusplus • extern "C" { • #endif • /* • * Class: HelloWorld • * Method: displayHelloWorld • * Signature: ()V • */ • JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld • (JNIEnv *, jobject); • #ifdef __cplusplus • } • #endif • #endif 3.

  7. 2ème étape (2) : L ’argument JNIEnv • Fonction :Interagir avec la JVM • Comportement : Pointeur sur GetFieldID Pointeur sur GetMethodID Pointeur sur FindClass … GetFieldID() GetMethodID() FindClass() JNIEnv *

  8. 3ème étape : Implémentation du code natif #include <jni.h> #include "HelloWorld.h" #include <stdio.h> JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld( JNIEnv *env, jobject obj) { printf("Hello world!\n"); return; }

  9. 4ème étape : Compilation et Exécution • Compiler le code C (exemple sous Linux) : $ gcc -shared -I ./java/include \ –I ./java/include/linux HelloWorldImp.c -o libhello.so • Génère une librairie dynamique • Exécution du programme : $ java HelloWorld • Appel de la méthode native par : System.loadLibrary("hello");

  10. Les types primitifs de la JNI • Accès direct aux primitives Java • Passage des données de type primitif par valeur Java Type Native Type Size in 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

  11. II. Les possibilités de la JNI • Passer des tableaux ou des chaînes de caractères • Interfacer un objet Java • Gérer des exceptions Java

  12. Passage d ’un objet Java (1 - Code Java) class MyJavaClass { public int aValue; public void divByTwo() { aValue /= 2; } } public class UseObjects { private native void changeObject(MyJavaClass obj); static { System.loadLibrary("UseObjImpl"); } public static void main(String[] args) { UseObjects app = new UseObjects(); MyJavaClass anObj = new MyJavaClass(); anObj.aValue = 2; app.changeObject(anObj); System.out.println("Java: " + anObj.aValue); } }

  13. Passage d ’un objet Java (2 - Code natif) #include <jni.h> extern "C" JNIEXPORT void JNICALL Java_UseObjects_changeObject( JNIEnv* env, jobject,jobject obj) { jclass clas = env->GetObjectClass(obj); jfieldID fid = env->GetFieldID(clas, "aValue", "I"); jmethodID mid = env->GetMethodID(clas, "divByTwo", "()V"); int value = env->GetIntField(obj, fid); printf("Native: %d\n", value); env->SetIntField(obj, fid, 6); env->CallVoidMethod(obj, mid); value = env->GetIntField(obj, fid); printf("Native: %d\n", value);}

  14. Signatures des types de la JVM Signature Type le langage Java Z boolean B byte C char S short I int J long F float D double

  15. III. Limites de la JNI • Perte de portabilité • Compilation  Rattachement à un système • Problèmes d’efficacité • Passages d ’information de la JNI vers la JVM • Faille de sécurité • Accès aux ressources systèmes

  16. Efficacité : graphe comparatif - rapide Code C Code Java +rapide C & Java

  17. Bilan d’étude • Des améliorations ont vu le jour entre 1.0, 1.1 et 1.2 • Solution à considérer en dernier recours • Possibilités de la version Java 1.4 • suppression de la pile liée au code natif • accès directe aux classes / méthodes C++

  18. Bibliographie • Ressources JNI • http://java.sun.com/docs/books/tutorial/native1.1 • http://developer.java.sun.com/developer/ • http://penserenjava.free.fr/pens/indexMain_18&00.htm • http://www.javaworld.com/jw-10-1998/jw-10-apptowin32.html #resources • Tests d ’efficacité • http://www.hyperactiveinc.com/tips.asp?tech=Java • http://www.str.com.au/jnibench/

More Related