Bonsoir,
Alors, en bref, tu as une classe Java avec une fonction native "beep" qui appel une fonction C
monpackage.Beeper
1 2 3 4 5 6 7 8
|
package monpackage;
public class Beeper {
public native void beep( int frequency, int duration );
} |
Tu passes un coup de javah là dessus, ça te fournit une fonction à implémenter en C/C++.
monpackage_Beeper.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| /* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class monpackage_Beeper */
#ifndef _Included_monpackage_Beeper
#define _Included_monpackage_Beeper
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: monpackage_Beeper
* Method: beep
* Signature: (II)V
*/
JNIEXPORT void JNICALL Java_monpackage_Beeper_beep
(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif |
Tu implémentes Java_monpackage_Beeper_beep dans un cpp :
monpackage_Beeper.cpp
1 2 3 4 5 6 7 8 9
| #include "monpackage_Beeper.h"
#include <windows.h>
JNIEXPORT void JNICALL Java_monpackage_Beeper_beep
(JNIEnv *, jobject, jint f, jint t)
{
Beep(f,t);
} |
Tu compiles le CPP en monpackage.dll (avec MinGW, ça donne ça), tu trouveras l'équivalent pour visual sur le net.
gcc -Wall -Wl,--kill-at -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -shared -o monpackage.dll monpackage_Beeper.cpp
Maintenant, pour tester ta JNI (c'est là le loadLibrary), tu ajoutes :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| monpackage.BeepTest
package monpackage;
public class BeeperTest {
static {
try{
//chargement de la DLL, si
System.loadLibrary("monpackage");
}catch( Exception e ){
System.err.println("impossible de charger monpackage.dll (recherche dans PATH et execution)");
e.printStackTrace();
}
}
public static void main( String argv[] ){
Beeper beeper = new Beeper();
beeper.beep(440,500);
}
} |
Tu exécutes et tu devrais entendre un "beau" LA! (si tu es chanceux).
Attention :
- La DLL doit pouvoir être chargée (PATH ou répertoire d'exécution), sinon, erreur de chargement du module
- Les options de compilation doivent être les bonnes, sinon, unsatisfied link error (il charge la DLL, mais ne trouve pas la fonction qui n'a pas le nom attendu dans la DLL)
Partager