2010-01-17 42 views
8

我在我的java應用程序中使用Jacob jar文件。如何在Java中配置.dll文件?

這個Jacob jar文件附帶一個.dll文件。我已將Jacob jar文件添加到我的類路徑中。但是,當我執行我的應用程序時出現運行時錯誤,因爲

"couldn't load jacob-1.15-M3-x86.dll file" 

如何加載此.dll文件?

已修改:============================================ =====================================

我已經設置了「路徑」環境變量到包含我的.dll文件和加載該.dll文件如下

static { 
    System.loadLibrary("jacob-1.15-M3-x86.dll"); 
} 

但出現下列錯誤

java.lang.UnsatisfiedLinkError: no jacob-1.15-M3-x86.dll in java.library.path 
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1734) 
    at java.lang.Runtime.loadLibrary0(Runtime.java:823) 
    at java.lang.System.loadLibrary(System.java:1028) 
    at TemplateClass.TemplateClass.<clinit>(TemplateClass.java:14) 
+0

更新了我的答案。 – 2010-01-17 20:00:29

+0

將dll放在windows的system32文件夾中解決了我的問題 – 2012-06-05 12:11:22

回答

5

阿目錄,這不是一個編譯錯誤,但運行時錯誤。

我的猜測是你的DLL需要在PATH上。不是CLASSPATH,但是PATH,因爲這是Windows查找DLL的位置。嘗試擴展PATH以包含DLL的位置,或者做許多其他人的操作:將DLL轉儲到\Winnt\System\System32或任何系統目錄在您的盒子上調用。換句話說,無論其他所有DLL如何。

更新

您發佈,值得慶幸的是,被指出確切的問題的錯誤消息。你可以通過把包含你的DLL的目錄放入java.library.path來解決這個問題。這個太陽論壇線程顯示了一個很好的例子:http://forums.sun.com/thread.jspa?threadID=627890

實際上,這比它應該少得多。這似乎是Java中「更加陡峭」的領域之一。線程徘徊了很多,我建議你閱讀一下,看看一些問題和解決方案。我認爲你可以通過一些試驗和錯誤獲得成功。

+0

是的,這是一個運行時錯誤。我錯誤地寫了它。謝謝。 – 2010-01-17 18:48:46

+0

你能看看編輯過的問題嗎? – 2010-01-17 19:40:00

10

'jacob-1.15-M3-x86.dll'需要放在操作系統可以找到它的地方。這裏有幾個選項:

  • 您可以將.dll文件放在您啓動應用程序的目錄中。如果你有一個批處理腳本來啓動你的應用程序,那就是該目錄。如果你是從某種應用服務器開始的,那麼它通常是'bin'目錄。

  • 您可以將.dll文件放置在%PATH%環境變量中的某處。我可能更容易更新您的PATH環境變量以包含包含您的.dll文件的目錄。

  • 另一種選擇是將您的.dll放入%SystemRoot%\ system32目錄。通常這是'C:\ Windows \ system32'。除非它是像MSCVRT運行時這樣的共享庫,否則通常不推薦使用此選項。

您可能遇到的另一個可能的問題。如果.dll編譯爲32位,則必須在32位Java運行時運行。同樣,如果它是64位.dll,它需要在64位JRE中運行。

+0

我的問題解決了。感謝那。 {...您可以將.dll文件放在您啓動應用程序的目錄中}您的意思是主類所在的目錄?如果是,那麼爲什麼如果我使用批處理腳本,文件應該位於批處理腳本所在的目錄中? 當我想要在應用程序服務器中啓動時,您能否介紹一下您的第一點,並更加關注點? – 2010-01-17 18:56:35

+0

你能看看編輯過的問題嗎? – 2010-01-17 19:37:31

+0

它應該位於您開始Java過程的目錄中,而不是您的主要類目錄。 – 2010-01-18 01:11:38

1

您需要設置LD_LIBRARY_PATH。 This將爲您提供遵循的所有正確步驟。

+1

這是假設他在Linux上運行,對吧? – 2010-01-17 18:52:07

+1

如果他在Linux上運行,JACOB將不會非常有用! – finnw 2010-02-08 14:41:16

+0

我假設有一個用於Linux的.so。相同的評論適用。 – duffymo 2014-09-03 22:07:26

3

其他選項:

  • 一套物業的java.library.path到包含DLL的目錄。示例: java -Djava.library.path =「path/to/directory/contained/the/dll」-jar appli.jar
  • 在代碼中,使用System.load顯式加載dll。
+0

他們兩個都不工作。 – 2010-01-17 19:50:18

0

我有同樣的問題。

我看到這個問題沒有「回答」,所以也許上面的選項都不起作用。

我最後的一個假設是Jacob.dll缺少它的依賴關係。

我所做的就是得到depend並檢查Jacob所使用的所有依賴性是否都加載完畢。 當然這適用於Windows。

乾杯!

1

當您使用System.loadLibrary()不包括.dll末尾

此外,如果您未將java.library.path設置爲指向包含該DLL的文件夾,則該DLL應該位於啓動Java應用程序的目錄中。