<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>http://www.minetti.org/mediawiki/index.php?action=history&amp;feed=atom&amp;title=Java%3AJNI</id>
		<title>Java:JNI - Historique des versions</title>
		<link rel="self" type="application/atom+xml" href="http://www.minetti.org/mediawiki/index.php?action=history&amp;feed=atom&amp;title=Java%3AJNI"/>
		<link rel="alternate" type="text/html" href="http://www.minetti.org/mediawiki/index.php?title=Java:JNI&amp;action=history"/>
		<updated>2026-05-04T12:59:58Z</updated>
		<subtitle>Historique pour cette page sur le wiki</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>http://www.minetti.org/mediawiki/index.php?title=Java:JNI&amp;diff=108&amp;oldid=prev</id>
		<title>Jp : Page créée avec « == But == Java Native Interface (JNI) permet à une application Java d'exécuter du code natif placé dans des bibliothèques chargées dynamiquement (DLL sous Windows et... »</title>
		<link rel="alternate" type="text/html" href="http://www.minetti.org/mediawiki/index.php?title=Java:JNI&amp;diff=108&amp;oldid=prev"/>
				<updated>2016-04-07T17:57:14Z</updated>
		
		<summary type="html">&lt;p&gt;Page créée avec « == But == Java Native Interface (JNI) permet à une application Java d&amp;#039;exécuter du code natif placé dans des bibliothèques chargées dynamiquement (DLL sous Windows et... »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== But ==&lt;br /&gt;
Java Native Interface (JNI) permet à une application Java d'exécuter du code natif placé dans des bibliothèques chargées dynamiquement (DLL sous Windows et SO sous Linux).&lt;br /&gt;
&lt;br /&gt;
JNI est bien adapté pour accéder à ses propres bibliothèques. Par contre si l'on doit accéder à des bibliothèques tiers, [[Java:JNA|JNA]] est mieux adapté.&lt;br /&gt;
&lt;br /&gt;
== Pré-requis ==&lt;br /&gt;
Pas de pré-requis si ce n'est qu'une plateforme de développement C++ opérationnelle.&lt;br /&gt;
&lt;br /&gt;
== Mode opératoire ==&lt;br /&gt;
* Déclarer les méthodes natives dans le code Java:&lt;br /&gt;
 public native void myMethodA();&lt;br /&gt;
* Implémenter le chargement de la bibliothèque dans le code d'initialisation statique de la classe (celle qui contient les déclarations des méthodes natives) - sous MS Windows le fichier se nommera myLibrary.dll et myLibrary.so sous Linux:&lt;br /&gt;
 static {&lt;br /&gt;
   System.loadLibrary(&amp;quot;myLibrary&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
* Compiler la classe Java:&lt;br /&gt;
 javac MyClass.java&lt;br /&gt;
* Générer les fichier d'en-tête [[Portail:C++|C]] (extension .h) en exécutant la commande:&lt;br /&gt;
 javah -jni MyClass&lt;br /&gt;
* Implémenter le code natif en [[Portail:C++|C]].&lt;br /&gt;
* Compiler le code natif en [[Portail:C++|C]]:&lt;br /&gt;
 gcc -c -I&amp;quot;%JAVA_HOME%\include&amp;quot; -I&amp;quot;%JAVA_HOME%\include\win32&amp;quot; -o MyClass.o MyClass.c&lt;br /&gt;
* Créer le fichier .def correspondant à la bibliothèque:&lt;br /&gt;
 EXPORTS&lt;br /&gt;
 Java_MyClass_myMethodA&lt;br /&gt;
* Créer la bibliothèque:&lt;br /&gt;
 gcc -shared -o myLibrary.dll MyClass.o MyClass.def&lt;br /&gt;
&lt;br /&gt;
== Appel d'objet Java passé en paramètre ==&lt;br /&gt;
Il est possible d'appeler des méthodes d'un objet Java passé en paramètre. Par exemple, si nous avons la fonction native suivante:&lt;br /&gt;
 public native void loadDeviceTree (final UsbDeviceTreeBuilder builder);&lt;br /&gt;
&lt;br /&gt;
La fonction [[Portail:C++|C]] aura la signature suivante:&lt;br /&gt;
 JNIEXPORT void JNICALL Java_org_minetti_test_JniLibrary_loadDeviceTree(JNIEnv *env, jobject obj, jobject builderObject)&lt;br /&gt;
&lt;br /&gt;
Dans le source [[Portail:C++|C]] de la bibliothèque, notre objet sera du type '''jobject'''. Pour appeler une méthode quelconque de cette objet, il faudra d'abord déterminer sa signature en tapant la commande suivante à partir du répertoire où sont compilés les classes Java (ici, le répertoire Maven):&lt;br /&gt;
 cd target\classes&lt;br /&gt;
 javap -s -p org.minetti.test.UsbDeviceTreeBuilder&lt;br /&gt;
&lt;br /&gt;
Par exemple, ça pourrait donner ceci:&lt;br /&gt;
 Compiled from &amp;quot;UsbDeviceTreeBuilder.java&amp;quot;&lt;br /&gt;
 public final class org.minetti.test.UsbDeviceTreeBuilder extends java.lang.Object{&lt;br /&gt;
 private int level;&lt;br /&gt;
   Signature: I&lt;br /&gt;
 public org.minetti.test.UsbDeviceTreeBuilder();&lt;br /&gt;
   Signature: ()V&lt;br /&gt;
 public void down();&lt;br /&gt;
   Signature: ()V&lt;br /&gt;
 public void up();&lt;br /&gt;
   Signature: ()V&lt;br /&gt;
 public void addHostController(java.lang.String);&lt;br /&gt;
   Signature: (Ljava/lang/String;)V&lt;br /&gt;
 public void addRootHub();&lt;br /&gt;
   Signature: ()V&lt;br /&gt;
 public void addHub(int, int, java.lang.String, java.lang.String, int, java.lang.String, short, short, short);&lt;br /&gt;
   Signature: (IILjava/lang/String;Ljava/lang/String;ILjava/lang/String;SSS)V&lt;br /&gt;
 public void add(int, int, java.lang.String, java.lang.String, int, java.lang.String, short, short, short);&lt;br /&gt;
   Signature: (IILjava/lang/String;Ljava/lang/String;ILjava/lang/String;SSS)V&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous revenons à notre source [[Portail:C++|C]] afin d'implémenter, par exemple, l'appel à la méthode '''addHostController''' de notre objet '''UsbDeviceTreeBuilder''' (signature: (Ljava/lang/String;)V):&lt;br /&gt;
 jclass builderClass = env-&amp;gt;GetObjectClass(builderObject);&lt;br /&gt;
 jmethodID addHostControllerMethod = env-&amp;gt;GetMethodID(builderClass, &amp;quot;addHostController&amp;quot;, &amp;quot;(Ljava/lang/String;)V&amp;quot;);&lt;br /&gt;
 jstring name = env-&amp;gt;NewStringUTF(&amp;quot;MyName&amp;quot;);&lt;br /&gt;
 env-&amp;gt;CallVoidMethod(builderObject, addHostControllerMethod, name);&lt;br /&gt;
&lt;br /&gt;
== Conversions types C en Java ==&lt;br /&gt;
* Pour convertir une chaîne de caractère codé en UTF-8:&lt;br /&gt;
 char *cStr = &amp;quot;Exemple de chaîne de caractères&amp;quot;;&lt;br /&gt;
 jstring javaStr = env-&amp;gt;NewStringUTF(cStr);&lt;br /&gt;
* Pour convertir une chaîne de caractère Unicode:&lt;br /&gt;
 WCHAR *cStr = L&amp;quot;Exemple de chaîne de caractères&amp;quot;;&lt;br /&gt;
 jstring javaStr = env-&amp;gt;NewString((const jchar*)buf, wcslen(buf));&lt;br /&gt;
&lt;br /&gt;
== Gestion des exceptions ==&lt;br /&gt;
Le code [[Portail:C++|C++]] suivant permet d'intercepter les exceptions C pour les renvoyer dans le code Java:&lt;br /&gt;
 try {&lt;br /&gt;
   ...&lt;br /&gt;
 }&lt;br /&gt;
 catch (const char *message) {&lt;br /&gt;
   env-&amp;gt;ThrowNew(env-&amp;gt;FindClass(&amp;quot;java/lang/Exception&amp;quot;), message);&lt;br /&gt;
 }&lt;br /&gt;
Ici, l'exception renvoyée sera de type java.lang.Exception. Ce code doit être obligatoirement placé dans la fonction appelé par le code Java (c'est à dire la fonction native).&lt;/div&gt;</summary>
		<author><name>Jp</name></author>	</entry>

	</feed>