Tôi có chương trình java Client.class sử dụng thư viện chia sẻ cpp libclient.so qua JNI. libclient.so được xây dựng dưới dạng chia sẻ và sử dụng thư viện chia sẻ cpp libhttp.so.System.loadLibrary không hoạt động. UnsatisfiedLinkError cho lib thứ hai trong chuỗi
libclient.so và libhttp.so được đặt trong thư mục /home/client/lib64
Client.class được đặt trong /home/client/bin
Khách hàng có thể tải thư viện với
- System.load và LD_LIBRARY_PATH biến môi trường
- System.loadLibrary và -Djava.library.path
Cách đầu tiên hoạt động tốt.
export LD_LIBRARY_PATH = /home/client/lib64
java -classpath ./bin Khách hàng
Cách Secon thất bại.
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
Khi tôi đặt libhttp.so vào/usr/lib64 cách thứ hai hoạt động tốt.
Tại sao libclient.so đang tìm libhttp.so trong/usr/lib64 nếu tôi sử dụng System.loadLibrary? Làm cách nào để khắc phục sự cố mà không cần phải đối mặt với libhttp.so trong/usr/lib64?
đang tải của tôi:
//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;
}
}
}
thông tin bổ sung.
Nếu tôi kiểm tra libclient.so với ldd thì tôi thấy: libhttp.so => không tìm thấy Nếu tôi đặt LD_LIBRARY_PATH =/home/client/lib64 xuất thì tôi thấy: libhttp.so => / home/client/lib64/libhttp.so