it-swarm.com.de

So fügen Sie der Java.library.path-Datei unter Linux eine .so-Datei hinzu

Ich arbeite mit einer Java) - Anwendung, die eine .dll - Datei in Java.library.path in Windows benötigt. Um dieselbe Anwendung unter Linux auszuführen, habe ich die entsprechende .so -Datei, die unter Linux zu Java.library.path hinzugefügt werden sollte. Bisher habe ich keine einfache Lösung dafür gefunden

Ich habe den .so In einem Ordner abgelegt, der sich bereits im Klassenpfad befindet, aber meine Anwendung beschwert sich immer noch, dass in .so Keine erforderliche Java.library.path - Datei vorhanden ist.

Ich würde gerne finden:

  1. Möglichkeiten, .so Zu Java.library.path Hinzuzufügen
  2. Woher wissen, ob es bereits hinzugefügt wurde (wenn hinzugefügt)
43
Lihkinisak

Fügen Sie das übergeordnete Verzeichnis zu LD_LIBRARY_PATH Hinzu, bevor Sie die Anwendung starten

        export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/some/pathOfContainingDirectory

Verwenden Sie Java -XshowSettings:properties, Um den Wert für Java.library.path (und andere) anzuzeigen.

60

Ich hatte große Probleme, dies herauszufinden. Bitte stellen Sie sicher, dass der Bibliotheksname das Präfix lib enthält.

Also Schritte,

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

  2. Benennen Sie Bibliotheken um, um lib als Präfix zu haben. [Als Teil des Build-Skripts hinzufügen]

    mv JNIDemo.so libJNIDemo.so
    

Überprüfen Sie diese Antwort auf detaillierte Erklärungen https://stackoverflow.com/a/3987567/2076566

6
teardrop

Ich habe die Methode Java -XshowSettings: properties verwendet und den Pfad eines zuvor festgelegten Ordners gefunden und meine so-Datei in diesen Ordner kopiert

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;
        }
    }
}

Ich bin der Meinung, dass dies eine bessere Möglichkeit ist, da nur ein einziger Link erstellt werden muss, keine Dateibearbeitungen erforderlich sind, keine Exporte oder das Ausführen von Quellcode, bevor eine Anwendung ausgeführt wird. Und keine bashrc-Leitungen benötigt.

Das heißt, wenn Sie ein Upgrade durchführen, kann dies zu unbeabsichtigten Fehlern in zukünftigen Java Versionen führen, da möglicherweise eine veraltete Bibliothek geladen wird, obwohl dies auch durch Entfernen eines Links behoben wird.

Dies funktioniert unter Ubuntu 18.04 mit Java 11 OpenSDK installiert.

$ locate libjawt.so
$ Java -XshowSettings:properties

Aus den beiden obigen Befehlen können Sie die beiden Pfade ermitteln, die Sie benötigen, um diese an Ihr eigenes System anzupassen.

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

Ich habe einen Symlink für Java ll open sdk erstellt, um die Bibliothek zu finden, und meiner lautete wie folgt, da/usr/lib einer der Pfade in der Ausgabe ist. Es gibt (in meiner Ausgabe) einen Java - Pfad, den Sie anstelle von/usr/lib verwenden können, wenn Sie die Java - Bibliothek (auch Symlinks) zusammenhalten möchten.

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