我有一個應用程序使用.jar中調用.dll的方法。這在我的機器上工作正常(當應用程序解包或以.jar本身運行時),但是當application.jar在另一臺機器上運行時,系統路徑中的外部.dll文件無法運行dll文件。如何引用.jar文件中的.dll
.dll是否必須位於任何特殊位置?我認爲,因爲它在系統路徑上會被發現。
在此先感謝
Dougie
我有一個應用程序使用.jar中調用.dll的方法。這在我的機器上工作正常(當應用程序解包或以.jar本身運行時),但是當application.jar在另一臺機器上運行時,系統路徑中的外部.dll文件無法運行dll文件。如何引用.jar文件中的.dll
.dll是否必須位於任何特殊位置?我認爲,因爲它在系統路徑上會被發現。
在此先感謝
Dougie
我建議把它在同一文件夾作爲您的應用程序。話雖如此,「它無法運行dll文件」有點模糊......你確定它不是一個問題,因爲其他DLL是不同的版本(因此不能正確加載,而不是在所有)?
此外,庫搜索路徑由java.library.path parameter定義。
確定您正在使用Sun JVM,可以通過在命令行上設置Java庫路徑來在命令行中指定本地庫的位置。
這可以通過選擇「-Djava.library.path = DLL目錄」
它可以取決於庫是如何在Java源代碼加載完成。你有訪問這個嗎?你能發佈代碼嗎?
如果java代碼使用System.load(字符串),它會期望dll的完整路徑。
如果它使用System.loadLibrary(String),它只需要庫名稱並將在java.library.path參數指定的位置進行搜索。
嘗試使用:
File dll = new File([...]);
System.load(dll.getAbsolutPath());
我會打包DLL在同一目錄下的jar歸檔。
java.library.path解決方案並不總是很好:在許多情況下,您無法更改JVM參數。更好的解決方案:
1)已經提到:把DLL在同一目錄下JAR,不幸的是它使得這種JAR的使用難度 - 現在JAR不僅僅是一個JAR,但伴隨DLL
2)將JAR作爲正常資源放入JAR中,在JAR啓動過程中將該DLL抽取到某處,例如$ TMP,然後像上面一樣使用System.load(new File(...))。然後這個JAR只是一個JAR,這個JAR的用戶甚至可能不知道它使用任何DLL
您也可以使用Maven NAR插件,如果您使用Maven構建版本,這非常強大。請參閱http://duns.github.com/maven-nar-plugin/
也許在ClassPath上,但我並不真正知道...... – 2010-03-30 16:01:38
您是否可以添加有關正在使用的操作系統的更多信息?此外,Java代碼是簡單使用JNI還是使用某種平臺特定的技術(如使用J-Integra加載COM庫)?最後,你是否嘗試過簡單地將DLL文件和JAR文件放在同一個目錄中? – 2010-03-30 16:02:17