Java,在classpath中加载本机库
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java,在classpath中加载本机库相关的知识,希望对你有一定的参考价值。
我有以下分布
.__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脚本中设置库路径可能会破坏某些东西吗?如何获得前一个解决方案的库的绝对文件系统路径?
假设我没有遗漏任何东西,是不是设置System.load最好的方法?你的lib.so不会改变,因为你的结构中有它。如果您希望控制最终用户从其他地方加载本机/共享库,则在start.sh中有一个可选参数。否则使用System.load()。只需确保检查操作系统的类型,因为您将拥有不同的文件路径格式。
load()
方法需要将库的完整路径名作为参数。例如,在Solaris系统上,您可以编写:
System.load("/home/me/libs/libmylib.so");
在/home/me/libs
目录中加载libmylib.so库。
使用load()
方法是系统相关的,因为它使用pathname
加载库,路径名通常依赖于系统。因此,loadLibrary()
有时是更好的选择。但是,动态可加载的库本质上是系统相关的,因此使用load()
可能不会损害系统独立性,只不过是加载库本身的行为。
loadLibrary()
方法只需要加载的名称:
System.loadLibrary("mylib");
loadLibrary()
方法搜索库。 loadLibrary()
执行的搜索取决于您运行的系统,但通常会搜索为此目的设置的一个环境变量中列出的目录。
您可以明确指定绝对路径。
除了系统独立性之外,安全性没有明显差异。
参考文献:
2)https://www.chilkatsoft.com/java-loadLibrary-Linux.asp
以上是关于Java,在classpath中加载本机库的主要内容,如果未能解决你的问题,请参考以下文章
本机库 sqljdbc_auth.dll 已在另一个类加载器中加载