我有一個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。
您是否知道此操作需要您的小程序進行簽名,並且需要用戶授予所有權限的授權? – duskwuff 2014-11-09 03:07:40
是的,我是。對於那件事我沒有任何疑問。我只是不知道如何爲此編寫我的代碼。這是我第一次使用JNLP並從JAR加載本地庫。 – 2014-11-09 03:14:28
基本上我的問題是我應該寫什麼來加載存儲在另一個JAR文件中的本地庫?我還需要知道它的名稱(JAR文件),還是使用以下命令從JAR請求文件時:ACWrapper.class.getResourceAsStream(libraryNameWithouExtension);它會遍歷所有下載的JAR文件並找到該文件? – 2014-11-09 03:18:21