2011-09-29 22 views
2

我想導出使用JNI接口的Java應用程序,並通過System.loadLibrary(「dllName」)加載Dll。在導出時提供System.loadLibrary的Dll路徑

a)Dll文件存在於Java Project文件夾以及C驅動器中,JVM將在運行時搜索dll的位置之一。

問題:當我將該項目導出爲Jar並將其提供給客戶端時,客戶端應該能夠運行該工具,而無需輸入Dll文件的麻煩。我無法想象通過另一種方式來完成這件事;通過使用System.load(「path:\」)來提供絕對路徑;因爲我不知道用戶在哪裏下載Jar文件。你能幫我解決這個問題嗎?非常感謝你。

回答

1

您需要將DLL放在應用程序運行的相同路徑中,在系統路徑中或在啓動應用程序之前將其路徑添加到PATH變量中。

+0

我對你的答案感到困惑,請你用一個例子來重述它。 –

0

,如果在同一個目錄中JAR文件的loacted下面的代碼片段將加載DLL不管工作目錄:

CodeSource codeSource = MainClass.class.getProtectionDomain().getCodeSource(); 
File jarFile = new File(codeSource.getLocation().toURI().getPath()); 
File parentDir = jarFile.getParentFile(); 
File dllFile = new File(parentDir, "my.dll"); 
System.load(dllFile.getPath()); 
+0

謝謝。 MainClass在這裏是什麼,如果我只是在項目目錄中有dll,你的解決方案將工作。 –

+0

MainClass是放入此片段的類的類名稱。該DLL必須位於與JAR文件相同的目錄中。如果相對位置不同,只需將其前置到「my.dll」,如父目錄的「../my.dll」即可。 –

0

看一看Runtime.load

將指定的文件名加載爲動態庫。文件名 參數必須是完整的路徑名稱。從java_g中,它會自動在「.so」之前插入「_g」(例如 Runtime.getRuntime().load(「/ home/avh/lib/libX11.so」);)。

首先,如果有安全管理器,其checkLink方法稱爲 ,其文件名爲其參數。這可能會導致安全 異常。

這與loadLibrary(String)方法類似,但它接受一個 通用文件名作爲參數,而不僅僅是一個庫名, 允許加載任何本機代碼文件。

方法System.load(String)是調用此方法的常規和方便 手段。

相關問題