JNI Java, C++ avec une carte k8055
yanojni
Messages postés
4
Statut
Membre
-
yanojni Messages postés 4 Statut Membre -
yanojni Messages postés 4 Statut Membre -
bonjour je fais appel à vous car j'ai un problème. je suis actuellement sur un projet avec comme langage de programmation Java.
Mon projet consiste à faire fonctionner une carte velleman k8055 en java sauf que le hic, c'est que la carte est dans un autre langage le C++.
Après plusieurs recherches je suis parvenu à trouver une solution pour utiliser la carte en java, c'est le JNI (Java Native Interface), je ne suis pas un expert donc j'ai beaucoup de mal à comprendre.
voilà mon problème, j'ai codé en premier une classe pour appeler la carte k8055 en java : Javak8055Call.java
- Je la compile :
- Un fichier Javak8055Call.class se crée
- ensuite je crée un fichier natif depuis le programme java en C++:
Le code natif Javak8055Call.h est crée
- ensuite je crée un programme depuis le .h natif: Javak8055Call.cpp
- Je compile le Javak8055Call.cpp et aussi le k8055.cpp de la classe de base en mettant je crois le lien où est stocké le jni.h que je dois utiliser. Ça ressemble à cela :
- Ensuite je crée une librairie partagée:
et pour finir j'exécute le programme en java :
Voilà l'erreur que je reçois après l'exécution:
je tiens à dire que tous mes fichiers sont dans le même dossier.
En espérant avoir une réponse positive
Cordialement
Mon projet consiste à faire fonctionner une carte velleman k8055 en java sauf que le hic, c'est que la carte est dans un autre langage le C++.
Après plusieurs recherches je suis parvenu à trouver une solution pour utiliser la carte en java, c'est le JNI (Java Native Interface), je ne suis pas un expert donc j'ai beaucoup de mal à comprendre.
voilà mon problème, j'ai codé en premier une classe pour appeler la carte k8055 en java : Javak8055Call.java
- Je la compile :
javac Javak8055Call.java
- Un fichier Javak8055Call.class se crée
- ensuite je crée un fichier natif depuis le programme java en C++:
javah Javak8055Call
Le code natif Javak8055Call.h est crée
- ensuite je crée un programme depuis le .h natif: Javak8055Call.cpp
- Je compile le Javak8055Call.cpp et aussi le k8055.cpp de la classe de base en mettant je crois le lien où est stocké le jni.h que je dois utiliser. Ça ressemble à cela :
g++ -c -fPIC -I"/usr/lib/jvm/java-7-openjdk-amd64/include/" -I"/usr/lib/jvm/java-7-openjdk-amd64/include/linux" -o test1.o k8055.cpp
g++ -c -fPIC -I"/usr/lib/jvm/java-7-openjdk-amd64/include/" -I"/usr/lib/jvm/java-7-openjdk-amd64/include/linux" -o test.o JavaK8055Call.cpp
- Ensuite je crée une librairie partagée:
g++ -shared -fPIC -o libJavaK8055Call.so test1.o
et pour finir j'exécute le programme en java :
java -Djava.library.path=. Javak8055Call
Voilà l'erreur que je reçois après l'exécution:
root@debian:/home/user/TestJ# java -Djava.library.path=. JavaK8055Call
Exception in thread "main" java.lang.UnsatisfiedLinkError: JavaK8055Call.OpenDevice()V
at JavaK8055Call.OpenDevice(Native Method)
at JavaK8055Call.main(JavaK8055Call.java:44)
je tiens à dire que tous mes fichiers sont dans le même dossier.
En espérant avoir une réponse positive
Cordialement
1 réponse
-
Bonjour,
Tu pourrais regarder ce projet :
https://sourceforge.net/projects/k8055-java-wrap/
Tu peux utiliser le wrapper fourni, ou au moins t'inspirer de son code.-
-
Les différentes étapes de développement en JNI :
1) écrire le code Java, en déclarantnative
les méthodes qui seront implémentées en C/C++, sans oublier de charger la DLL qui contiendra le code.
2) Compiler le code Java avecjavac
pour obtenir les .class
3) Générer les headers C/C++ avecjavah
pour obtenir les .h
4) Ecrire le code C/C++ qui implémente les headers générés.
5) Compiler la DLL à partir du code C/C++
6) Exécuter le programme Java sans oublier de lui fournir la DLL -
Le soucis c'est que je suis sous linux donc ce n'est pas des DLL mais des .so.
J'ai donc créer une librairie dynamique .so, ensuite j'ai compilé et il m'a mis ce message d'erreur: "java: symbol lookup error: avec le lien de ma librairie .so suivit lookup error : Opendevice"
Je pense que le problème vient de la librairie qui ne fait pas le lien entre le java et le C mais je sais pas comment faire la compilation correctement.
Merci
-