2017-08-16 139 views
1

我需要一種方法來加載庫內的jar文件而不提取它。有沒有一種方法,我可以用這樣的getClass()方法的getResourceAsStream(「XXX」)動態加載本機庫

結構將作如下安排:

myjar.jar 
- lib/ 
    - <somelib>.<libext> 
- <package> 
    - Foo.class 

Foo.class將是類加載,並連接到機庫和方法也應該工作,如果lib文件夾是<package>

回答

0

無裏面,有沒有辦法從一個jar文件里加載庫無需解壓首先,你需要至少到提取庫tmp文件夾爲了成爲ab勒例如使用加載它:

System.load("path/to/libAbc.so")

這不是目前在java中可以從內存或zip文件加載庫。加載庫的方法是native void ClassLoader.NativeLibrary.load(String name),庫的namejava.lang.ClassLoader在內部用於保留加載庫的軌道,所以目前您不能使用與真實文件不同的任何內容作爲本機庫加載,因爲它不適合目前的機制。

由於本地庫的裝載與本地代碼的幫助下完成的,答案取決於是否有一種方式來加載本地庫中的C代碼:dlopen from memory?

理論上是可以做到的 ,但由於它是平臺特定的,並且需要考慮和解決的許多方面,因此它不是用Java實現的,它也不是C中的標準和/或簡單的事情。

目前在java中,沒有辦法做到這一點,如果有人會創建這樣的本地庫,那麼這可能會改變,但現在我不知道任何這樣的庫。

+0

不應該這樣,因爲它可以讀取jar中的任何文件,而lib仍然是一個文件,System.LoadLibrary()仍然會讀取路徑中的文件。所以應該沒有辦法直接在內存中發送完整的內容,並從內存中讀取? –

+0

@Android_Dev *不應該這樣,因爲它可以讀取jar中的任何文件,並且lib仍然是一個文件,System.LoadLibrary()仍然會讀取路徑中的文件。所以應該沒有辦法直接在內存中發送完整的內容,並從內存中讀取內容?*爲什麼你會這麼想?加載*本地庫*由操作系統完成,而不是由JVM完成。 –

+0

@AndrewHenle是的,我知道它必須由操作系統加載,但操作系統不關心代碼的物理位置,指針和註冊代碼存儲在內存中,所以如果我可以直接發送一切到這一點將正常執行(我假設)。 –