我有java程序Client.class,它通過JNI使用cpp共享庫libclient.so。 libclient.so被構建爲共享並使用cpp共享庫libhttp.so。System.loadLibrary不起作用。鏈中第二個庫的UnsatisfiedLinkError
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的第二種方式工作正常。
爲什麼libclient.so在/ usr/lib64中查找libhttp.so,如果我使用System.loadLibrary? 我該如何修復它而不將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 =>找不到 如果我設置出口LD_LIBRARY_PATH = /家庭/客戶/ lib64下,然後我看到:libhttp.so => /家庭/客戶機/ lib64/libhttp.so