JNI経由でcpp共有ライブラリlibclient.soを使用するJavaプログラムClient.classがあります。libclient.so は共有としてビルドされ、cpp 共有ライブラリ libhttp.so を使用します。
libclient.so と libhttp.so は、Client.class が配置されているフォルダーに配置されます/home/client/lib64
。/home/client/bin
クライアントはライブラリをロードできます
- System.load と環境変数 LD_LIBRARY_PATH
- System.loadLibrary および -Djava.library.path
最初の方法はうまくいきます。
export LD_LIBRARY_PATH = /home/client/lib64
java -classpath ./bin クライアント
2 番目の方法は失敗します。
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 に入れると、2 番目の方法で問題なく動作します。
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 => 見つかりません export LD_LIBRARY_PATH = /home/client/lib64 を設定すると、次のように表示されます: