web-dev-qa-db-fra.com

Comment ajouter un fichier .so à Java.library.path sous Linux

Je travaille avec une application Java qui nécessite un fichier .dll Dans Java.library.path sous Windows. Pour exécuter la même application sous Linux, j'ai le .so fichier qui devrait être ajouté à Java.library.path sur une machine Linux, je n'ai pas trouvé de solution facile pour l'instant

J'ai placé le .so Dans un dossier qui se trouve déjà dans le chemin de classe, mais mon application se plaint toujours du fait qu'il n'y a pas de fichier .so Requis dans Java.library.path

J'aimerais trouver:

  1. Façons d'ajouter .so À Java.library.path
  2. Comment savoir si c'est déjà ajouté (quand ajouté)
43
Lihkinisak

Ajoutez le répertoire contenant à LD_LIBRARY_PATH avant de lancer l'application

        export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/some/pathOfContainingDirectory

Utilisation Java -XshowSettings:properties pour afficher la valeur Java.library.path (et autres).

60
Jose Luis Martin

J'ai eu beaucoup de difficulté à comprendre cela, assurez-vous que vous avez le préfixe lib dans le nom de la bibliothèque.

Alors pas à pas,

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

  2. Renommez les bibliothèques pour avoir lib comme préfixe. [Ajouter ceci dans le cadre du script de construction]

    mv JNIDemo.so libJNIDemo.so
    

Cochez cette réponse pour des explications détaillées https://stackoverflow.com/a/3987567/2076566

6
teardrop

J'ai utilisé la méthode Java -XshowSettings: properties et trouvé le chemin d'un dossier précédemment défini, puis copié mon fichier so dans ce dossier

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

Je pense que c'est une meilleure façon de le faire, car il ne nécessite qu'un seul lien à créer, aucune modification de fichier nécessaire, aucune exportation ou exécution du code source avant l'exécution d'une application. Et pas de lignes de base nécessaires.

Cela dit, si vous effectuez une mise à niveau, des erreurs non intentionnelles risquent de se produire lors des futures Java versions car cela pourrait charger une bibliothèque obsolète, bien que la suppression d'un lien résout également ce problème.

Cela fonctionne sous Ubuntu 18.04 avec Java 11 opensdk installé.

$ locate libjawt.so
$ Java -XshowSettings:properties

A partir des deux commandes ci-dessus, vous pouvez trouver les deux chemins nécessaires pour l’ajuster à votre propre système.

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

J'ai créé un lien symbolique pour Java. Ll a ouvert sdk pour trouver la bibliothèque. La mienne était comme suit, car/usr/lib est l'un des chemins de la sortie. Il y a (dans ma sortie) a = Java que vous pouvez choisir d'utiliser à la place de/usr/lib si vous souhaitez conserver Java (même des liens symboliques) ensemble.

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