Mam program klienta java Client.class, który używa biblioteki współdzielonej cpp libclient.so przez JNI. libclient.so jest zbudowany jako udostępniony i używa biblioteki współdzielonej cpp libhttp.so.System.loadLibrary nie działa. UnsatisfiedLinkError dla drugiej biblioteki w łańcuchu
libclient.so i libhttp.so są umieszczone w folderze /home/client/lib64
Client.class jest umieszczony w /home/client/bin
klient może załadować bibliotekę z
- System.load i zmienna środowiskowa LD_LIBRARY_PATH
- System.loadLibrary i -Djava.library.path
Pierwszy sposób działa dobrze.
export LD_LIBRARY_PATH = /home/client/lib64
java -classpath ./bin Klienta
Sposób secon zawiedzie.
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
Kiedy kładę libhttp.so w katalogu/usr/lib64 drugi sposób działa dobrze.
Dlaczego libclient.so szuka libhttp.so w/usr/lib64, jeśli używam System.loadLibrary? Jak mogę to naprawić bez kopiowania biblioteki libhttp.so do/usr/lib64?
Mój kod ładowania:
//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;
}
}
}
dodatkowe informacje.
Gdybym przetestować libclient.so z ldd potem widzę: libhttp.so => Nie znaleziono Jeżeli ustawić export LD_LIBRARY_PATH =/home/client/lib64 potem widzę: libhttp.so => / home/client/lib64/libhttp.so