web-dev-qa-db-ja.com

Linuxで.soファイルをJava.library.pathに追加する方法

私は、WindowsのJava.library.pathで.dllファイルを必要とするJavaアプリケーションで作業しています。Linuxで同じアプリケーションを実行するには、それぞれの.soファイルがありますLinuxマシンのJava.library.pathに追加する必要がありますが、これまでのところ簡単な解決策は見つかりませんでした

.soを既にクラスパスにあるフォルダーに入れましたが、アプリケーションは.soに必要なJava.library.pathファイルがないとまだ文句を言います

私は見つけたい:

  1. .soJava.library.pathに追加する方法
  2. 既に追加されているかどうかを確認する方法(追加された場合)
43
Lihkinisak

アプリケーションを起動する前に、含まれるディレクトリをLD_LIBRARY_PATHに追加します

        export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/some/pathOfContainingDirectory

Java -XshowSettings:propertiesを使用して、Java.library.path(およびその他)の値を表示します。

60

これを理解するのに苦労しました。ライブラリ名にlibプレフィックスが含まれていることを確認してください。

だから、ステップ、

  1. export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/some/pathOfContainingDirectory"

  2. ライブラリの名前を変更して、プレフィックスがlibになるようにします。 [ビルドスクリプトの一部としてこれを追加]

    mv JNIDemo.so libJNIDemo.so
    

詳細な説明については、この回答を確認してください https://stackoverflow.com/a/3987567/2076566

6
teardrop

Java -XshowSettings:propertiesメソッドを使用し、以前に設定されたフォルダーのパスを見つけ、そのsoファイルをそのフォルダーにコピーしました

3
Ravindu
File file = null;
private String[] libs_path = System.getProperty("Java.library.path").split(":");
public boolean isInstalled() {
    boolean isInstalled = false;
    for(String lib : libs_path) {
            file = new File(lib+"/"+"yourlib.so");
            if(file.exists()) {
                isInstalled = true;
                break;
            }
        }
    return isInstalled;
}


public void install() {
    if(!isInstalled) {
        for(String lib: lib_path) {
             // copy your .so to lib
             break;
        }
    }
}

単一のリンクを作成するだけで、ファイルを編集する必要も、アプリケーションを実行する前にソースをエクスポートしたり実行したりする必要もないため、これがより良い方法だと思います。また、bashrc行は必要ありません。

ただし、アップグレードすると、古いライブラリをロードする可能性があるため、将来のJavaリリースに意図しないエラーが発生する可能性がありますが、リンクを1つ削除することでも解決します。

これは、Java 11 opensdkがインストールされているubuntu 18.04で動作します。

$ locate libjawt.so
$ Java -XshowSettings:properties

上記の2つのコマンドから、これを独自のシステムに調整するために必要な2つのパスを見つけることができます。

Sudo ln -s /path/from/locate/libjawt.so /path/from/properties/libawt.so

Java ll sdkを開いてライブラリを見つけるためのシンボリックリンクを作成しました。 Java/usr/libの代わりに使用することを選択できるパス。Javaライブラリ(シンボリックリンクも含む)を保持する場合。

Sudo ln -s /usr/lib/jvm/Java-11-openjdk-AMD64/lib/libjawt.so /usr/lib/libjawt.so
0
Chris