我需要一種方法來加載庫內的jar文件而不提取它。有沒有一種方法,我可以用這樣的getClass()方法的getResourceAsStream(「XXX」)動態加載本機庫
結構將作如下安排:
myjar.jar
- lib/
- <somelib>.<libext>
- <package>
- Foo.class
凡Foo.class
將是類加載,並連接到機庫和方法也應該工作,如果lib文件夾是<package>
我需要一種方法來加載庫內的jar文件而不提取它。有沒有一種方法,我可以用這樣的getClass()方法的getResourceAsStream(「XXX」)動態加載本機庫
結構將作如下安排:
myjar.jar
- lib/
- <somelib>.<libext>
- <package>
- Foo.class
凡Foo.class
將是類加載,並連接到機庫和方法也應該工作,如果lib文件夾是<package>
無裏面,有沒有辦法從一個jar文件里加載庫無需解壓首先,你需要至少到提取庫tmp
文件夾爲了成爲ab勒例如使用加載它:
System.load("path/to/libAbc.so")
這不是目前在java中可以從內存或zip文件加載庫。加載庫的方法是native void ClassLoader.NativeLibrary.load(String name)
,庫的name
由java.lang.ClassLoader
在內部用於保留加載庫的軌道,所以目前您不能使用與真實文件不同的任何內容作爲本機庫加載,因爲它不適合目前的機制。
由於本地庫的裝載與本地代碼的幫助下完成的,答案取決於是否有一種方式來加載本地庫中的C代碼:dlopen from memory?
理論上是可以做到的 ,但由於它是平臺特定的,並且需要考慮和解決的許多方面,因此它不是用Java實現的,它也不是C中的標準和/或簡單的事情。
目前在java中,沒有辦法做到這一點,如果有人會創建這樣的本地庫,那麼這可能會改變,但現在我不知道任何這樣的庫。
如果不將它放在某處(至少是某個臨時位置),您無法做到這一點。
你可以在這裏看看:
https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo031
這個配方給你一個模板,將您的本機庫從罐子,提取它,並加載Java代碼中。
與JNI玩得開心!
不應該這樣,因爲它可以讀取jar中的任何文件,而lib仍然是一個文件,System.LoadLibrary()仍然會讀取路徑中的文件。所以應該沒有辦法直接在內存中發送完整的內容,並從內存中讀取? –
@Android_Dev *不應該這樣,因爲它可以讀取jar中的任何文件,並且lib仍然是一個文件,System.LoadLibrary()仍然會讀取路徑中的文件。所以應該沒有辦法直接在內存中發送完整的內容,並從內存中讀取內容?*爲什麼你會這麼想?加載*本地庫*由操作系統完成,而不是由JVM完成。 –
@AndrewHenle是的,我知道它必須由操作系統加載,但操作系統不關心代碼的物理位置,指針和註冊代碼存儲在內存中,所以如果我可以直接發送一切到這一點將正常執行(我假設)。 –