JNI Java, C++ avec une carte k8055

yanojni Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   -  
yanojni Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   -
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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
yanojni
 
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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   Statut Membre Dernière intervention  
 
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