2011-08-01 5 views
1

J'ai lu beaucoup de messages à ce sujet, mais aucun ne résout mon problème.Un autre problème DLL JNI UnsatisfiedLinkError

J'ai une très petite DLL qui permet à un processus Java d'envoyer des messages Windows. Il appelle simplement

FindWindowEx(...) 
    SendMessage(...) 

Je compilé avec VS2005 et lié avec/MT et tout est très bien, mais si je tente de faire ma DLL dépendent MSVCRT et lien avec/MD je reçois l'erreur de liaison non satisfaite.

java.lang.UnsatisfiedLinkError: MyDll.dll: Vous ne trouvez pas les bibliothèques dépendantes

Selon depends.exe il a deux DLL manquantes, GPSVC.DLL et Ieshims.dll. Le premier existe dans c: \ windows \ system32 et le second dans un chemin winsxs. Il y a des CHARGES d'autres DLLs chargées de c: \ windows \ system32 et GPSVC.DLL est un impair en ce que même en tant qu'administrateur sur ma machine win7x64, je ne peux pas courir dépend de cela - il dit qu'il n'est pas trouvé ...

Quoi qu'il en soit, j'ai essayé de forcer une charge de ces deux DLL dans mon Java en (simplifié - Je ne suis pas dans le contrôle de java.library.path)

Field field = ClassLoader.class.getDeclaredField("usr_paths"); 
    field.setAccessible(true); 
    String[] paths = (String[]) field.get(null); 
    String[] tmp = new String[paths.length + 2]; 
    System.arraycopy(paths, 0, tmp, 0, paths.length); 
    tmp[paths.length] = "c:/windows/system32"; 
    tmp[paths.length + 1] = "c:/Windows/winsxs/amd64_microsoft-windows-ie-ieshims_31bf3856ad364e35_8.0.7601.17514_none_c06d7c9c27da8591"; 
    field.set(null, tmp); 

mais qui n'a fait aucune différence. Je peux me replier pour le rendre statiquement lié, mais je préfère ne pas le faire.

Des idées sur ce que je peux essayer ensuite? Antony

Répondre

0

Eh bien, j'utilise Visual Studio 2010 mais cela pourrait aussi fonctionner en 2005.

Vous pouvez essayer de configurer le compilateur VC en utilisant vcvarsall.bat que vous pouvez trouver dans ProgramFiles dans/MicrosoftVisualStudio20xx/VC.

Vous n'avez qu'à lancer vsvarsall.bat en ligne de commande avec l'une des options suivantes: x86 ou ia64 ou x86_amd64 ou x86_ia64. Je ne sais pas si cela aidera, mais cela pourrait être l'un des problèmes que le compilateur VC n'est pas configuré pour fonctionner avec une machine 64 bits.

Lorsque je travaille avec JNI, j'utilise la ligne de commande pour compiler le code et j'ai dû configurer le compilateur sur une machine 64 bits.

Ou vous pouvez potentiellement essayer de le compiler via la ligne de commande. Voici mon tutoriel préféré http://www.ibm.com/developerworks/java/tutorials/j-jni/index.html

+0

Je construis une version 32 bits et 64 bits de ma DLL et exécute vcvarsall avec x86 ou amd64 selon les besoins. Ma ligne de commande CL est: cl/I% JAVA_HOME% \ include/I% JAVA_HOME% \ include \ win32/nologo/W4/EHsc/O2/D "NDEBUG"/D "WIN32"/D _USRDLL/MT/LD PresencePump.cpp /FePresencePump-%1.dll/link/subsystem: windows : Ces deux DLL fonctionnent en utilisant le lien statique/MT ci-dessus, mais si j'utilise/MD/D _AFXDLL, j'ai le problème. – adb