我有通过 JNI 使用 cpp 共享库 libclient.so 的 java 程序 Client.class。libclient.so 构建为共享并使用 cpp 共享库 libhttp.so。
libclient.so 和 libhttp.so 放在文件夹/home/client/lib64
Client.class 放在/home/client/bin
客户端可以加载库
- System.load 和环境变量 LD_LIBRARY_PATH
- System.loadLibrary 和 -Djava.library.path
第一种方法效果很好。
export LD_LIBRARY_PATH = /home/client/lib64
java -classpath ./bin 客户端
第二种方式失败。
java -classpath ./bin -Djava.library.path=./../lib64 Client
java.lang.UnsatisfiedLinkError: /home/client/lib64/libclient.so: libhttp.so: cannot open shared object file: No such file or directory
当我将 libhttp.so 放入 /usr/lib64 时,第二种方法可以正常工作。
如果我使用 System.loadLibrary,为什么 libclient.so 会在 /usr/lib64 中寻找 libhttp.so?如何在不将 libhttp.so 复制到 /usr/lib64 的情况下修复它?
我的加载代码:
//Try load from -Djava.library.path
boolean found = false;
String lib = "client";
try {
System.loadLibrary(lib);
found = true;
} catch (UnsatisfiedLinkError e) {
e.printStackTrace();
}
//Try load from LD_LIBRARY_PATH
if (!found) {
lib = "libclient.so";
String ld_lib_path = System.getenv("LD_LIBRARY_PATH");
String[] paths = ld_lib_path.split(":");
for(int i=0; i<paths.length; i++) {
String p = paths[i];
File x = new File(p, lib);
if (x.exists()) {
System.load(x.getAbsolutePath());
found = true;
break;
}
}
}
附加信息。
如果我用 ldd 测试 libclient.so,我会看到:libhttp.so => not found 如果我设置 export LD_LIBRARY_PATH = /home/client/lib64,那么我会看到:libhttp.so => /home/client/lib64/libhttp.so