2011-08-01 2 views
1

Я читал много сообщений об этом, но никто не затрагивает мою проблему.Другая проблема JNI UnsatisfiedLinkError DLL

У меня очень маленькая DLL, которая позволяет процессу Java отправлять сообщения Windows. Он просто вызывает

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

Я собрал, что с VS2005 и связаны с/т, и все это хорошо, но если я пытаюсь сделать мой DLL зависит от MSVCRT и связь с/MD, то я получаю неудовлетворенную ошибку связи.

java.lang.UnsatisfiedLinkError: MyDll.dll: Не удается найти зависимые библиотеки

По depends.exe имеет два недостающих библиотек DLL, GPSVC.DLL и ieshims.dll. Первый существует в c: \ windows \ system32, а второй - в пути winsxs. Есть LOADS из других DLL, загруженных из c: \ windows \ system32 и GPSVC.DLL - это странно, даже когда администратор моей машины win7x64, я не могу работать, зависит от этого - он говорит, что он не найден ...

во всяком случае, я пытался принуждать загрузку обоих этих библиотек DLL в моей Java с помощью (упрощенно - я не в состоянии контролировать 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); 

, но это не имело никакого значения. Я могу отказаться, чтобы сделать его статически связанным, но я бы предпочел.

Любые идеи о том, что я могу попробовать дальше? Antony

ответ

0

Ну, я использую Visual Studio 2010, но он может работать и в 2005 году.

Вы можете попробовать настроить компилятор VC с помощью vcvarsall.bat, который вы можете найти в ProgramFiles in/MicrosoftVisualStudio20xx/VC.

Вам нужно только запустить vsvarsall.bat в командной строке с помощью одной из следующих опций: x86 или ia64 или x86_amd64 или x86_ia64. Я не знаю, поможет ли это, но это может быть одной из проблем, с которыми компилятор VC не настроен на работу с 64-битной машиной.

Когда я работаю с JNI, я использую командную строку для компиляции кода, и мне пришлось настроить компилятор на 64-битной машине.

Или вы могли бы попытаться скомпилировать его с помощью командной строки. Вот мой любимый урок http://www.ibm.com/developerworks/java/tutorials/j-jni/index.html

+0

Я создаю 32-разрядную и 64-разрядную версию моей DLL и запускаю vcvarsall с x86 или amd64 по мере необходимости. Моя командная строка CL: 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 : Обе эти библиотеки DLL работают с использованием статического связывания/MT выше, но если я использую/MD/D _AFXDLL, то у меня есть проблема. – adb

Смежные вопросы