gpt4 book ai didi

java - 使用 java.library.path 和 LD_LIBRARY_PATH 的区别

转载 作者:IT王子 更新时间:2023-10-29 00:23:57 26 4
gpt4 key购买 nike

设置JVM参数有区别吗

-Djava.library.path=/path 

在 JVM 启动并设置 Linux 环境变量

export LD_LIBRARY_PATH=/path 

在 JVM 启动之前?

这两种方法的优点/缺点是什么?

最佳答案

第一种形式

-Djava.library.path=/path

会在java字节码级别处理,System.loadLibrary会调用Runtime.loadLibary,然后会调用java/lang/ClassLoader.loadLibrary。在函数调用 ClassLoader.loadLibrary 中,将检查系统属性 java.library.path 以获取库的完整路径并将此完整路径传递给 native 代码调用系统 api dlopen/dlsym,最终使库加载。可以从OpenJDK浏览源码存储库。以下代码片段是我从链接中复制的片段。

这种形式的优点是,如果您的库路径存在一些问题,您将在 Java 代码中收到错误或警告或异常。

// Invoked in the java.lang.Runtime class to implement load and loadLibrary.
static void loadLibrary(Class fromClass, String name,
boolean isAbsolute) {
ClassLoader loader =
(fromClass == null) ? null : fromClass.getClassLoader();
if (sys_paths == null) {
usr_paths = initializePath("java.library.path");
sys_paths = initializePath("sun.boot.library.path");
}
if (isAbsolute) {
if (loadLibrary0(fromClass, new File(name))) {
return;
}
throw new UnsatisfiedLinkError("Can't load library: " + name);
}
// ....

第二种形式

export LD_LIBRARY_PATH=/path

会在native中处理,根据dlopen/dlsym

的文档
 dlopen()
The function dlopen() loads the dynamic library file named by the null-terminated string filename and returns an opaque "handle" for the
dynamic library. If filename is NULL, then the returned handle is for the main program. If filename contains a slash ("/"), then it is
interpreted as a (relative or absolute) pathname. Otherwise, the dynamic linker searches for the library as follows (see ld.so(8) for fur‐
ther details):

o (ELF only) If the executable file for the calling program contains a DT_RPATH tag, and does not contain a DT_RUNPATH tag, then the
directories listed in the DT_RPATH tag are searched.

o If, at the time that the program was started, the environment variable LD_LIBRARY_PATH was defined to contain a colon-separated list of
directories, then these are searched. (As a security measure this variable is ignored for set-user-ID and set-group-ID programs.)

以这种方式,如果您的库路径存在一些问题并且系统无法加载您的库,系统将不会提供太多线索并会默默地失败(我猜)。这取决于是否实现LD_LIBRARY_PATH,Android 没有使用LD_LIBRARY_PATH 来确定库位置,您可以从here 看到Android 的实现。 .

关于java - 使用 java.library.path 和 LD_LIBRARY_PATH 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27945268/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com