2014-04-25 4 views
1

J'ai un programme Java qui appelle une fonction dans une bibliothèque JNI. Le code JNI charge statiquement une autre bibliothèque partagée.L'exécution de l'application Java qui effectue un appel JNI avec eclipse échoue avec UnsatisfiedLinkError: Impossible de trouver les bibliothèques dépendantes

Lors de l'exécution de l'application Java utilisant Eclipse, je reçois une erreur java.lang.UnsatisfiedLinkError: ... Vous ne trouvez pas les bibliothèques dépendantes

Mais, si j'exécute la même commande en ligne de commande, le programme fonctionne très bien . Qu'est-ce que je fais de mal dans Eclipse? Je me suis assuré d'aller à la vue de débogage -> processus -> propriétés de processus pour obtenir la même chaîne de commande et le même répertoire de travail que l'exécution d'Eclipse

Répondre

1

Voici une procédure PD qui pourrait vous aider à identifier le problème.

Ajoutez ce qui suit à votre programme pour identifier les différences dans les chemins d'arc et de chargement entre les deux environnements d'exécution. Enquêter sur les différences de chemin/arc.

System.out.println(System.getProperty("java.library.path")); 
System.out.println(System.getProperty("sun.arch.data.model")); 

Vous pouvez utiliser l'utilitaire dumpbin.exe pour identifier les dépendances requises par la DLL en cours de chargement. Assurez-vous que les dépendances existent. utilisation Exemple:

C:> dumpbin /imports your.dll 

Dump of file your.dll 
File Type: DLL 
    Section contains the following imports: 
    **KERNEL32.dll** 

Vous pouvez utiliser la commande where.exe pour trouver l'emplacement des dépendances. Exemple d'utilisation:

C:>where KERNEL32.dll 
    C:\Windows\System32\kernel32.dll 

Si vous voyez:

C:>where KERNEL32.dll 
    INFO: Could not find files for the given pattern(s) 

pourquoi la DLL Enquêter dépendante est pas sur le chemin.

Vous pouvez utiliser la commande dumpbin.exe pour vérifier 64 bits vs 32 bits.
Exemple:

C:>dumpbin /headers yourd.dll 

Dump of file yourd.dll 
PE signature found 
File Type: DLL 
FILE HEADER VALUES 
     14C machine (x86) <-- 32bit DLL 

C:>dumpbin /headers yourd.dll 

Dump of file yourd.dll 
PE signature found 
File Type: DLL 
FILE HEADER VALUES 
     8664 machine (x64) <-- 64bit DLL 

enquêter sur toute 32bit vs mésappariements de 64 bits entre main/charge. Si votre JVM est 32 bits, vous devez utiliser des DLL 32 bits. Si votre machine virtuelle Java est en 64 bits, vous devez utiliser des DLL 64 bits. (Il est possible d'exécuter une machine virtuelle Java 32 bits sur un système d'exploitation 64 bits, mais les DLL JNI doivent être 32 bits (les DLL correspondent à la machine virtuelle Java et non au système d'exploitation.)

Questions connexes