我的分布如下
.__bin
| |__start.sh
|
|__lib
|__Main.jar
|__Utility.jar
|__lib.so
Main.jar 包含main方法,在该方法中,我想访问分发中捆绑的 lib.so 提供的本机函数。 start.sh 只需设置类路径并引导Java。
在应用程序内部加载 lib.so 库的最佳方法是什么?我知道两种方法:
前者需要文件系统中库的绝对路径,后者需要设置应用程序特定的 java.library.path JVM参数。在这种情况下哪个更好的解决方案?在 start.sh 脚本中设置库路径是否可能会破坏某些内容?如何获得前一种解决方案的库的绝对文件系统路径?
答案 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()
执行的搜索取决于您所运行的系统,但是通常,它会搜索为此目的设置的环境变量之一中列出的目录。
您可以明确指定绝对路径。
除了系统独立性之外,在安全性方面没有真正的区别。
参考: