JNI Java, C++ avec une carte k8055

Fermé
yanojni Messages postés 3 Date d'inscription vendredi 20 mars 2015 Statut Membre Dernière intervention 2 avril 2015 - Modifié par KX le 20/03/2015 à 21:29
yanojni Messages postés 3 Date d'inscription vendredi 20 mars 2015 Statut Membre Dernière intervention 2 avril 2015 - 2 avril 2015 à 11:45
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 :
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
A voir également:

1 réponse

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
20 mars 2015 à 21:27
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.
0
Merci pour votre réponse, j'ai déjà regardé le code de ce que vous me proposez mais je n'ai pas trouvé de solution grâce à celui ci
Mon problème vient plus de la compilation des programmes, l'ordre dans lequel je les compile n'est pas correct, je m'interroge encore la dessus
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
20 mars 2015 à 21:50
Les différentes étapes de développement en JNI :

1) écrire le code Java, en déclarant
native
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 avec
javac
pour obtenir les .class
3) Générer les headers C/C++ avec
javah
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
0
yanojni Messages postés 3 Date d'inscription vendredi 20 mars 2015 Statut Membre Dernière intervention 2 avril 2015
2 avril 2015 à 11:45
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
0