Java,在类路径中加载本机库

时间:2018-09-19 05:27:50

标签: java jar java-native-interface shared-libraries classloader

我的分布如下

.__bin
|   |__start.sh
|
|__lib
    |__Main.jar
    |__Utility.jar
    |__lib.so

Main.jar 包含main方法,在该方法中,我想访问分发中捆绑的 lib.so 提供的本机函数。 start.sh 只需设置类路径并引导Java。

在应用程序内部加载 lib.so 库的最佳方法是什么?我知道两种方法:

  • System.load(绝对路径
  • System.loadLibrary(名称

前者需要文件系统中库的绝对路径,后者需要设置应用程序特定的 java.library.path JVM参数。在这种情况下哪个更好的解决方案?在 start.sh 脚本中设置库路径是否可能会破坏某些内容?如何获得前一种解决方案的库的绝对文件系统路径?

2 个答案:

答案 0 :(得分:1)

假设我什么都不丢失,不是将System.load设置为最佳方法吗?您的lib.so不会更改,因为您已经在结构中拥有它。如果要控制最终用户从其他地方加载本机/共享库,请在start.sh中有一个可选参数。否则,请使用System.load()。请确保检查操作系统的类型,因为文件路径的格式将有所不同。

答案 1 :(得分:1)

load()方法需要库的完整路径名作为参数。例如,在Solaris系统上,您可以编写:

System.load("/home/me/libs/libmylib.so");

libmylib.so 库加载到/home/me/libs目录中。

使用load()方法是系统相关的,因为它使用pathname来加载库,并且路径名通常是系统相关的。因此,loadLibrary()有时是一个更好的选择。但是,可动态加载的库本质上是依赖于系统的,因此使用load()可能不会损害系统独立性,而不仅仅是加载库本身。

loadLibrary()方法仅需要加载a的名称:

System.loadLibrary("mylib");

loadLibrary()方法搜索库。 loadLibrary()执行的搜索取决于您所运行的系统,但是通常,它会搜索为此目的设置的环境变量之一中列出的目录。

您可以明确指定绝对路径。

除了系统独立性之外,在安全性方面没有真正的区别。

参考

1)https://security.stackexchange.com/questions/35724/security-implications-of-javas-system-load-vs-system-loadlibrary

2)https://www.chilkatsoft.com/java-loadLibrary-Linux.asp