从jar加载库

时间:2010-11-06 13:42:22

标签: java java-native-interface

如何从jar加载库? e.g。

Test.jar
 +- libAbc.so
 +- libDef.so
 +- ...

5 个答案:

答案 0 :(得分:8)

可能不是您正在寻找的答案(将文件解压缩到临时位置 您正在寻找的答案),但我想我会分享一些真实世界的经验:

从jar中提取库所需的管道,确保它之后得到清理,不会与可能使用jar的其他应用程序冲突等......非常棘手。它可以完成,但是你可能会遇到大量临时用户系统的临时副本,或者你最终会在使用这些库的多个应用程序之间发生冲突。

当您添加许多操作系统不允许将任何文件用作库的事实时(通常,将运行您的应用程序的用户的权限不允许它们标记任意文件在执行的临时文件夹中,将本机库打包在jar中的想法变得不那么有吸引力了。

我们最终做的是转移到我们拥有安装程序的模型( 以足够的权限运行)将适当的本机库放在jar旁边。这很简单,将所有执行库保存在同一个地方,并且易于管理和理解(尝试在一个应用程序中跟踪版本不兼容性b / c它正在尝试加载保存到临时存储的库通过第二次申请是一场噩梦。)

答案 1 :(得分:6)

你必须将它解压缩到一些临时目录并使用`System.load(“path / to / libAbc.so”)。

这是discussed previously

已修改:更正了链接。

答案 2 :(得分:2)

底层操作系统正在加载本机代码,如果该代码无法在jar文件中查看以获取要加载的字节(Windows无法加载),则必须自己在文件系统中访问它。

您可以在jar文件旁边部署库吗?

答案 3 :(得分:0)

必须从文件系统加载库。因此,您可以将jar从jar中提取到临时目录中并加载它。

答案 4 :(得分:0)

您必须从 JAR 中提取文件并加载它们;

System.load("path/to/files/<name>.so");

但是不要忘记在程序关闭后清理文件,如果提取它们不需要太长时间;

libraryFile.deleteOnExit();