动态加载本机库

时间:2017-08-16 11:58:00

标签: java java-native-interface static-libraries dynamic-class-loaders

我需要一种方法来在jar文件中加载库而不提取它。有没有办法可以使用像getClass()这样的方法.getResourceAsStream(“xxx”)

结构如下:

Foo.class

<package>将是加载并连接到本机库的类,如果lib文件夹位于groovy

内,方法也应该有效

3 个答案:

答案 0 :(得分:0)

不,没有办法从jar文件里面加载库而不先解压缩,你需要将库至少提取到tmp文件夹中才能够使用例如:

加载它

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中,没有办法做到这一点,如果有人会创建这样的本地库,这可能会改变,但是现在我不知道任何这样的库。

答案 1 :(得分:0)

如果不把它放在某处(至少是一些临时位置),你就无法做到。

你可以看看这里:

https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo031

此配方为您提供了一个模板,该模板将从jar中获取本机库,将其解压缩并加载到Java代码中。

与JNI玩得开心!

答案 2 :(得分:0)

还有sci-java本地lib loader处理这个问题(尽管它是在后台提取出来的)。 您可能需要尝试:https://mvnrepository.com/artifact/org.scijava/native-lib-loader