Erreur JNI lors de l’appel d’un sous-programme C

Je veux appeler un sous-programme C de Java. J’utilise JNI. J’ai créé les fichiers .java, .c et .h et ai compilé une DLL. Tous les fichiers sont dans le même dossier. Mais lorsque je lance le programme, il affiche une unsatisfiedlinkError . Où est-ce que je vais mal …?

Alors que j’apprends JNI, le code source que j’ai utilisé est celui de: http://www.ibm.com/developerworks/java/tutorials/j-jni/section2.html et des choses que j’ai déjà essayées:

  • Créez une dll en utilisant Code :: Blocks (ide) et GCC comme compilateur
  • Créer une DLL en utilisant GCC à partir de la ligne de commande (réf. Http://sig9.com/node/35 )
  • J’utilise Win7 32 bits et toutes les méthodes ci-dessus génèrent des DLL 32 bits
  • Toutes les solutions que j’ai trouvées pour créer une DLL (bibliothèque partagée) sont pour MS VC / VCPP et je n’ai pas cela sur ma machine pour le moment.

Où est le problème? Les fichiers DLL sont générés sans exception, mais lorsque j’exécute le code Java, l’exception est levée.


PS: S’il existe des exemples théoriques expliquant le fonctionnement de JNI et ce qu’il fait réellement, merci de partager le lien …

Le message ou l’exception en cours de lancement:

  c:\myjava1>java Sample1 Exception in thread "main" java.lang.UnsatisfiedLinkError: Sample1.intMethod(I)I at Sample1.intMethod(Native Method) at Sample1.main(Sample1.java:11) 

À la fin de la journée après la création du fichier dll de nombreuses fois, je suis presque sûr qu’il n’y a probablement aucun problème avec cela, quelque chose ne va pas avec le chemin d’access … J’ai changé la méthode loadlibrary avec la méthode load , mais toujours pas de chance …..


comme suggéré par un MOD: J’ai discuté de cette question sur le post: Erreur JNI lors de l’appel d’un sous-programme C, je poste tous les codes ici car les commentaires ont des caractères limités … Sample1.c

 #include "jni.h" #include"Sample_Sample1.h" JNIEXPORT jint JNICALL Java_Sample_Sample1_test(JNIEnv *env, jobject obj){ return(1); } void main(){} 

Sample1.java

 package Sample; public class Sample1 { public native int test(); static{ System.loadLibrary("Sample1"); } public static void main(Ssortingng[] args) { Sample1 sample = new Sample1(); System.out.println(sample.test()); } } 

Sample_Sample1.h (généré à l’aide de la commande javah -jni)

 /* DO NOT EDIT THIS FILE - it is machine generated */ #include "jni.h" /* Header for class Sample_Sample1 */ #ifndef _Included_Sample_Sample1 #define _Included_Sample_Sample1 #ifdef __cplusplus extern "C" { #endif /* * Class: Sample_Sample1 * Method: test * Signature: ()I */ JNIEXPORT jint JNICALL Java_Sample_Sample1_test (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif 

Quelqu’un peut-il m’indiquer où se situe le problème? Dans un message précédent, j’ai mentionné que le code que j’utilise est celui des tutoriels, mais simplement pour corriger les modifications que j’ai apscopes aux codes … Tout en utilisant ** java Sample.Sample1 “i am obtenir:

c: \ myjava1> java Sample.Sample1 Exception dans le fil “principal” java.lang.UnsatisfiedLinkError: Sample.Sample1.test () I à Sample.Sample1.test (Méthode native) à Sample.Sample1.main (Sample1.java: 12)

Votre bibliothèque doit être explicitement définie sur votre chemin .

Il se peut que les drapeaux que vous utilisez ne soient pas tout à fait corrects. Essaye ça:

 gcc -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at \ -I[Java_HOME]/include -I[Java_HOME]/include/win32 \ -shared -o Sample1.dll Sample1.c 

Sur le site MinGW GCC .

Avez-vous vérifié votre DLL en l’appelant à partir d’une application stub C ++? Portez une attention particulière au nom exact (avec la casse) des méthodes que vous appelez.

La Javadoc de UnsatisfiedLinkError indique “Lancée si la machine virtuelle Java ne parvient pas à trouver une définition en langage natif appropriée d’une méthode déclarée native”. Cela signifie probablement que le nom est mal orthographié ou que votre DLL n’est pas celle où la machine virtuelle Java s’attend à le trouver.

Enfin résolu le problème en utilisant la méthode System.load (), System.loadLibrary () ne fonctionne toujours pas pour moi … il continue à donner la même exception, et je pense que le problème était avec le .dll Merci à tous vous qui avez soutenu et répondu …