I have a Client.class java program that uses cpp shared library libclient.so through JNI. libclient.so is built as shared and uses the cpp shared library libhttp.so.
libclient.so and libhttp.so are placed in the folder /home/client/lib64
Client.class is placed in /home/client/bin
The client can load the library using
- System.load variable and environment LD_LIBRARY_PATH
- System.loadLibrary and -Djava.library.path
The first method works fine.
export LD_LIBRARY_PATH = /home/client/lib64
java -classpath./bin Client
Failed to execute secon path.
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
When I put libhttp.so in / usr / lib 64, the second way works fine.
Why is libclient.so looking for libhttp.so in / usr / lib 64 if I use System.loadLibrary? How can I fix this without iterating through libhttp.so in / usr / lib 64?
My download code:
//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; } } }
Additional Information.
If I test libclient.so with ldd, then I see: libhttp.so => not found; If I set the export LD_LIBRARY_PATH = / home / client / lib64, then I see: libhttp.so => / home / client / lib64 / libhttp.so
source share