2014-11-09 226 views
0

我有一個C++庫,我已經爲OS X編譯,Windows & Unix。對於每一個我已經在Eclipse中創建了一個單獨的項目,並使用名稱約定導出它們: library-OS.jar如何從瀏覽器加載JAR文件加載庫?

每個罐子基本上包含:

庫OS.jar |

- > library.ext

我想從我的主要罐的小程序由他們解壓到一個臨時位置,並中用System.loadLibrary加載它們。

不幸的是我不知道如何獲得資源。

我正在嘗試使用 Extract and load DLL from JAR 但它是用於相對路徑而不是在線瀏覽器小程序。

所以我的問題是如何加載基於客戶端的操作系統的C庫。我正在使用JNI與它交談,並且它在一個單獨的JAR中以及加載該庫的。我正在研究JNLP,但如果使用JNLP,我不知道如何獲取Jar名稱。 :/

編輯:

public static void loadJarDll(String name) throws IOException { 
    InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(name); 
    byte[] buffer = new byte[1024]; 
    int read = -1; 
    File temp = new File(new File(System.getProperty("java.io.tmpdir")), name); 
    FileOutputStream fos = new FileOutputStream(temp); 

    while((read = in.read(buffer)) != -1) { 
     fos.write(buffer, 0, read); 
    } 
    fos.close(); 
    in.close(); 

    System.load(temp.getAbsolutePath()); 
} 

這是我目前使用的代碼。爲了加載庫,我通過名稱變量,它必須包含庫的擴展名。我想要做的只是請求庫的每個操作系統的通用名稱(例如,如果它的foobar.dll for windows和foobar.so for unix在加載時調用它foobar)。我想這樣加載它,因爲當我使用JNLP時,我只有一個包含特定操作系統和平臺的本地庫的JAR。

+0

您是否知道此操作需要您的小程序進行簽名,並且需要用戶授予所有權限的授權? – duskwuff 2014-11-09 03:07:40

+0

是的,我是。對於那件事我沒有任何疑問。我只是不知道如何爲此編寫我的代碼。這是我第一次使用JNLP並從JAR加載本地庫。 – 2014-11-09 03:14:28

+0

基本上我的問題是我應該寫什麼來加載存儲在另一個JAR文件中的本地庫?我還需要知道它的名稱(JAR文件),還是使用以下命令從JAR請求文件時:ACWrapper.class.getResourceAsStream(libraryNameWithouExtension);它會遍歷所有下載的JAR文件並找到該文件? – 2014-11-09 03:18:21

回答

1

Java Web Start已經內置了對原生分區和加載的支持。

  1. 分區:將Jar添加到特定於系統的resources部分。每個操作系統只會下載預定的資源。
  2. 加載:將上述的Jar的根放入本地,並將其提取並放置在應用程序的運行時類路徑中。
+0

你確定2嗎?我結束了使用System.Load(temp.getAbsolutePath()),但在此之前,我檢查了操作系統並保存了基於系統的庫的名稱。這是我傳遞給loadJarDll的值。 – 2015-01-28 10:36:01

+1

*「你確定約2?」*是的。但等等,讓我重新思考.. ***是的!*** – 2015-01-28 10:37:25

+0

那麼如果是這種情況,那麼我可以使用System.Load()沒有絕對路徑。但沒有它,圖書館永遠不會被加載。那麼,我在做錯什麼?我真的被運行時間類路徑弄糊塗了......:D – 2015-01-28 10:40:01