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:

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);
 
 
 
}
J'ai donc fais les commandes:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
javac InterfaceAvecC.java
javah -jni InterfaceAvecC
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
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
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
 
#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;
 
}
(Jint ne sert à rien pour l'instant).

Alors après il se passe quelque chose de bizarre.
Je veux compiler le InterfaceAvecC.c comme ceci:

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
J'ai un message d'erreur:

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:

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);
 
	}
 
}
Et j'ai une belle erreur:

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)
Je précise que tous mes fichiers sont dans le même dossier (il ne l'étais pas avant mais ça ne change rien).

Voila je vous dis un grand merci pour ceux qui auront le courage ou les connaissances nécéssaire pour m'aider