Title: Interfa
1Interfaç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
2Plan 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é
3I. Cas dutilisation de la JNI
- Accéder aux ressources système
- Utiliser du code déjà implémenté
- Coder une partie critique d un programme
4Présentation dun 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 dun programme Java
- 2. Création du fichier de prototypage
- 3. Implémentation des méthodes natives
- 4. Compilation / Exécution du programme
51è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()
-
62è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 ltjni.hgt / 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_displayH
elloWorld (JNIEnv , jobject) ifdef
__cplusplus endif endif
3.
72è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
83ème étape Implémentation du code natif
- include ltjni.hgt
- include "HelloWorld.h"
- include ltstdio.hgt
- JNIEXPORT void JNICALL
- Java_HelloWorld_displayHelloWorld(
- JNIEnv env, jobject obj)
-
- printf("Hello world!\n")
- return
94è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")
10Les 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 Jboole
an 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
11II. 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
12Passage 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) -
13Passage d un objet Java (2 - Code natif)
- include ltjni.hgt
- extern "C" JNIEXPORT void JNICALL
Java_UseObjects_changeObject( JNIEnv
env, jobject,jobject obj) jclass clas
env-gtGetObjectClass(obj) jfieldID fid
env-gtGetFieldID(clas, "aValue", "I") jmethodID
mid env-gtGetMethodID(clas, "divByTwo", "()V") - int value env-gtGetIntField(obj, fid)
- printf("Native d\n", value)
env-gtSetIntField(obj, fid, 6)
env-gtCallVoidMethod(obj, mid) value
env-gtGetIntField(obj, fid) printf("Native
d\n", value)
14Signatures 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
15III. Limites de la JNI
- Perte de portabilité
- Compilation ? Rattachement à un système
- Problèmes defficacité
- Passages d information de la JNI vers la JVM
- Faille de sécurité
- Accès aux ressources systèmes
16Efficacité graphe comparatif
- rapide
Code C
Code Java
rapide
C Java
17Bilan 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
18Bibliographie
- Ressources JNI
- http//java.sun.com/docs/books/tutorial/native1.1
- http//developer.java.sun.com/developer/
- http//penserenjava.free.fr/pens/indexMain_1800.h
tm - http//www.javaworld.com/jw-10-1998/jw-10-apptowin
32.html resources - Tests d efficacité
- http//www.hyperactiveinc.com/tips.asp?techJava
- http//www.str.com.au/jnibench/