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