Java,在classpath中加载本机库

问题描述 投票:1回答:2

我有以下分布

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

Main.jar包含main方法,其中我想访问分发中捆绑的lib.so提供的本机函数。 start.sh只是设置类路径和bootstraps java。

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

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

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

java jar java-native-interface shared-libraries classloader
2个回答
1
投票

假设我没有遗漏任何东西,是不是设置System.load最好的方法?你的lib.so不会改变,因为你的结构中有它。如果您希望控制最终用户从其他地方加载本机/共享库,则在start.sh中有一个可选参数。否则使用System.load()。只需确保检查操作系统的类型,因为您将拥有不同的文件路径格式。


1
投票

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

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.