Java 从jar加载库

Java 从jar加载库,java,java-native-interface,Java,Java Native Interface,如何从jar加载库? e、 g 底层操作系统正在加载本机代码,如果该代码无法在jar文件中查看以获取要加载的字节(Windows无法),则必须自己在文件系统中访问它 能否在jar文件旁边部署库?库必须从文件系统加载。因此,您可以将您的库从jar解压到一个临时目录中并将其加载。您必须将其解压到某个临时目录中,并使用`System.load(“path/to/libAbc.So”) 这是一个很好的例子 已编辑:更正了链接。可能不是您要寻找的答案(将文件提取到临时位置是您要寻找的答案),但我想与大家分

如何从jar加载库? e、 g


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


能否在jar文件旁边部署库?

库必须从文件系统加载。因此,您可以将您的库从jar解压到一个临时目录中并将其加载。

您必须将其解压到某个临时目录中,并使用`System.load(“path/to/libAbc.So”)

这是一个很好的例子


已编辑:更正了链接。

可能不是您要寻找的答案(将文件提取到临时位置是您要寻找的答案),但我想与大家分享一些真实世界的经验:

从jar中取出库所需的管道,确保它在事后得到清理,不会与可能正在使用jar的其他应用程序冲突,等等。。。这很棘手。这是可以做到的,但很有可能你会发现你的库的临时副本堆满了用户的系统,或者你会在使用库的多个应用程序之间产生冲突

当您添加一个事实,即许多操作系统不允许仅将任何文件用作库(并且运行您的应用程序的用户的权限通常不允许他们在临时文件夹中标记任意文件以供执行),将本机库打包到jar中的想法就变得不那么吸引人了


我们最后要做的是转换到一个模型,在这个模型中,我们的安装程序(运行时有足够的权限)将适当的本机库放在jar旁边。这相当简单,使所有执行库保持在同一位置,并且易于管理和理解(试图在一个应用程序中跟踪版本不兼容b/c它试图加载由第二个应用程序保存到临时存储的库完全是一场噩梦).

您的“之前讨论过的”链接的可能副本似乎不相关
Test.jar
 +- libAbc.so
 +- libDef.so
 +- ...