Bonjour,
Je suis actuellement confronté à un problème de liens de librairies lorsque je veux tester mon application Java effectuant des appels C en JNI.
J'utilise une librairie "DICO" écrite en C, pour laquelle je dispose d'un fichier "DICO.h" et un fichier "libDICO.a".
Ayant besoin d'utiliser les fonctions proposées par cette librairie en Java, j'ai donc réalisé une classe permettant d'appeler ces fonctions C en JNI, nommée "JDICO".
J'arrive donc bien à compiler le Java, à générer le JNI et je compile mon fichier C en librairie dynamique .so comme ceci :
gcc -shared -I$JAVA_HOME/include -I$JAVA_HOME/include/linux -Irep_projet/include -Lrep_projet/lib -lDICO JDICO.c -o libJDICO.so
Ensuite, quand je veux lancer mon programme de test utilisant la librairie JNI précédemment produite par la commande :
java -Djava.library.path=rep_projet/lib TestJDICO
J'obtiens un message d'erreur me signalant qu'il ne trouve pas une fonction de la librairie DICO en C :
Exception in thread "main" java.lang.UnsatisfiedLinkError: rep_projet/lib/libJDICO.so: rep_projet/lib/libJDICO.so: undefined symbol: DICO_connecter
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1751)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1676)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1030)
at JDICO.<clinit>(JDICO.java:62)
at TestJDICO.main(TestJDICO.java:70) |
Pour information complémentaires :
- DICO_connecter est une fonction de la librairie C DICO, définie dans "DICO.h" et implémentée dans "libDICO.a"
- la ligne 62 de JDICO.java est : System.loadLibrary("JDICO" );
- la ligne 70 de TestJDICO.java est : JDICO.connecter(); (il s'agit du premier appel à une fonction de notre librairie JNI).
En espérant que quelqu'un ici pourra m'aider 
Message édité par Minada le 13-06-2007 à 16:36:51