2011-08-01 47 views
1

我讀過很多關於此的帖子,但沒有解決我的問題。另一個JNI UnsatisfiedLinkError DLL問題

我有一個非常小的DLL,它允許Java進程發送Windows消息。它只是簡單地調用

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

我已經編譯與VS2005與/ MT和鏈接,所有的罰款,但如果我嘗試讓我的DLL依賴MSVCRT與/ MD鏈接,然後我得到了不合適的鏈接錯誤。

java.lang.UnsatisfiedLinkError中:MYDLL.DLL:找不到依賴庫

根據它的Depends.exe有兩個丟失的DLL,GPSVC.DLL和IESHIMS.DLL。第一個存在於c:\ windows \ system32中,第二個存在於winsxs路徑中。從c:\ windows \ system32加載其他DLL的負載和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); 

但並沒有區別。我可以後備讓它靜態鏈接,但我寧願不。

關於接下來我可以嘗試的任何想法? 安東尼

回答

0

那麼,我使用Visual Studio 2010,但它也可以在2005年工作。

您可以嘗試使用vcvarsall.bat配置VC編譯器,該編譯器可以在/ MicrosoftVisualStudio20xx/VC的ProgramFiles中找到。

您只需在命令行中使用以下選項之一啓動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,並根據需要運行x86或amd64的vcvarsall。我的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 /鏈接/子系統:windows :這兩個DLL工作使用上面的/ MT靜態鏈接,但如果我使用/ MD/D _AFXDLL,那麼我有問題。 – adb