2017-08-16 162 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是的,我知道它必须由操作系统加载,但操作系统不关心代码的物理位置,指针和注册代码存储在内存中,所以如果我可以直接发送一切到这一点将正常执行(我假设)。 –