Bonjour à tous!
Après de longue heures de recherche sur le net, je ne trouve pas de solution à mon problème, je viens donc vous demander votre aide
Voila j'essaye de créer une class InterfaceAvecC qui appelle des fonctions C, comme ceci:
J'ai donc fais les commandes:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 public class InterfaceAvecC { static{ System.loadLibrary("InterfaceAvecC"); } public static native String creerGraphe(int n); }
Pour créer un .h générré automatiquement, ce qui donne ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 javac InterfaceAvecC.java javah -jni InterfaceAvecC
Je créé le .c correspondant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class InterfaceAvecC */ #ifndef _Included_InterfaceAvecC #define _Included_InterfaceAvecC #ifdef __cplusplus extern "C" { #endif /* * Class: InterfaceAvecC * Method: creerGraphe * Signature: (I)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_InterfaceAvecC_creerGraphe (JNIEnv *, jclass, jint); #ifdef __cplusplus } #endif #endif
(Jint ne sert à rien pour l'instant).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 #include <stdlib.h> #include <string.h> #include "InterfaceAvecC.h" JNIEXPORT jstring JNICALL Java_InterfaceAvecC_creerGraphe (JNIEnv *env, jclass cl, jint ji) { /* traitement en C */ char* res="bonjour"; /* conversion du résultat en chaîne Java */ jstring jres = (*env)->NewStringUTF(env, res); /* libération mémoire */ return jres; }
Alors après il se passe quelque chose de bizarre.
Je veux compiler le InterfaceAvecC.c comme ceci:
J'ai un message d'erreur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 gcc -I/usr/lib/jvm/java-8-openjdk-amd64/include -I/usr/lib/jvm/java-8-openjdk-amd64/include/linux -c InterfaceAvecC.c gcc -shared -o libInterfaceAvecC.so InterfaceAvecC.o
gcc -shared -o libInterfaceAvecC.so InterfaceAvecC.o
/usr/bin/ld: InterfaceAvecC.o: réadressage de R_X86_64_32S en vertu de «*.rodata*» ne peut être utilisé lors de la création d'un objet partagé; recompilez avec -fPIC
InterfaceAvecC.o*: erreur lors de l'ajout de symboles*: Mauvaise valeur
collect2: error: ld returned 1 exit status
J'ai donc testé en compilant la première commande gcc avec -fPIC comme option et ça marche mais je ne sais pas pourquoi donc je précise au cas ou.
Ensuite j'essaye de compiler mon petit programme de test en java:
Et j'ai une belle erreur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 public class Test { public static void main(String[] args){ String s=InterfaceAvecC.creerGraphe(11); System.out.println(s); } }
Je précise que tous mes fichiers sont dans le même dossier (il ne l'étais pas avant mais ça ne change rien).Exception in thread "main" java.lang.UnsatisfiedLinkError: no InterfaceAvecC in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
at InterfaceAvecC.<clinit>(InterfaceAvecC.java:4)
at Test.main(Test.java:6)
Voila je vous dis un grand merci pour ceux qui auront le courage ou les connaissances nécéssaire pour m'aider
Partager