Contenu | Rechercher | Menus

Annonce

DVD, clés USB et t-shirts Ubuntu-fr disponibles sur la boutique En Vente Libre

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 18/11/2020, à 10:44

Omega38

[Résolu]Java et VLC - chargement de librairies .so

Bonjour,
J'ai développé avec Eclipse une application en Java, qui a pour objet de découper une vidéo en plusieurs "morceaux". Cette application s'appuie sur VLC.

Elle fonctionne parfaitement bien sur un poste de caractéristiques :
Ubuntu 18.04.5
Openjdk 11.0.9.1Oubuntu
VLC 3.08

Sur un poste :
Ubuntu 20.04.1
Openjdk 11.0.9.1Oubuntu
VLC 3.09.2-1
j’obtiens le message d'erreur suivant :

Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: libjawt.so: Ne peut ouvrir le fichier d'objet partagé: Aucun fichier ou dossier de ce type
	at com.sun.jna.Native.getWindowHandle0(Native Method)
	at com.sun.jna.Native$AWT.getComponentID(Native.java:1973)
	at com.sun.jna.Native.getComponentID(Native.java:265)
	at uk.co.caprica.vlcj.player.embedded.videosurface.CanvasVideoSurface.attach(CanvasVideoSurface.java:76)
	at uk.co.caprica.vlcj.player.embedded.DefaultEmbeddedMediaPlayer.attachVideoSurface(DefaultEmbeddedMediaPlayer.java:162)
	at uk.co.caprica.vlcj.player.embedded.DefaultEmbeddedMediaPlayer.onBeforePlay(DefaultEmbeddedMediaPlayer.java:327)
	at uk.co.caprica.vlcj.player.DefaultMediaPlayer.play(DefaultMediaPlayer.java:804)
	at main.MainWindow.initialisationVideo(MainWindow.java:1005) 
        ..........

Le fichier libjawt.so existe bien et est bien référencé comme librairie par Eclipse.

Je pense que c'est la nouvelle version de VLC qui amène cette erreur, mais je n'ai pas trouvé comment la traiter.

Merci de votre aide.

Dernière modification par Omega38 (Le 07/12/2020, à 07:24)

Hors ligne

#2 Le 18/11/2020, à 16:45

inbox

Re : [Résolu]Java et VLC - chargement de librairies .so

Salut,

Après avoir installé locate, si nécessaire, il faut mettre à jour la base de recherche de locate avec :

sudo updatedb

Sur tes deux systèmes, en précisant pour chacun qu'elle est la version de système, que donne cette commande ?

locate libjawt.so

A+

Dernière modification par inbox (Le 18/11/2020, à 16:45)


Un problème résolu ? Indiquez le en modifiant le titre du sujet.
Linux user 449594

Hors ligne

#3 Le 18/11/2020, à 18:15

Omega38

Re : [Résolu]Java et VLC - chargement de librairies .so

Bonjour,

D'abord, merci de t’intéresser à mon problème. La commande "locate" renvoie :

/usr/lib/jvm/java-11-openjdk-amd64/lib/libjawt.so

Néanmoins, j'ai un second disque dur qui contient mes sources, et lorsque je liste le répertoire "lib", j'obtiens :

az@az-System-Product-Name:/media/az/Data1To/LSFUtils-ws/vlcPlayer/src/lib$ ls
commons-io-2.6.jar      libjawt.so       libvlccore.so.9.0.0  libvlc.so.5.6.0          slf4j-api-1.7.21.jar
jna-4.1.0.jar           libvlccore.dll   libvlc.dll           org.eclipse.swt-3.1.jar  slf4j-simple-1.5.2.jar
jna-platform-4.1.0.jar  libvlccore.so.9  libvlc.so.5          slf4j-api-1.5.6.jar      vlcj-3.10.1.jar

Ce répertoire "lib" contenant libjawt.so est bien référencé par Eclipse.

Même chose sur le poste sur lequel le programme fonctionne (sauf que la librairie se trouve également dans le répertoire java d'Oracle installé en plus de openjdk).

Dernière modification par Omega38 (Le 18/11/2020, à 18:29)

Hors ligne

#4 Le 18/11/2020, à 18:39

inbox

Re : [Résolu]Java et VLC - chargement de librairies .so

Je pense que tu devrais lancer ton application Java dans Eclipse, si c'est possible. Le but étant de déboguer pour comprendre pourquoi la librairie en question n'est pas accessible par ton programme. Vu que ton dossier source est sur un disque externe, le problème pourrait venir de la.

Tu devrais aussi vérifier, avec la commande suivante, que la configuration des chemins de librairies est OK.

java -XshowSettings:properties

Un problème résolu ? Indiquez le en modifiant le titre du sujet.
Linux user 449594

Hors ligne

#5 Le 20/11/2020, à 11:25

Omega38

Re : [Résolu]Java et VLC - chargement de librairies .so

Bonjour,

Je reviens après plusieurs essais.

Tout d'abord, j'ai été imprécis dans ma demande : il ne s'agit pas d'un disque amovible, mais de 2 postes ayant des configurations identiques : un petit disque dur "système" et un plus gros "données".

J'ai installé sur le poste où j'ai le bug une version du jdk d'Oracle, histoire de voir s'il y avait une différence entre cette version et openjdk. Donc la commande de configuration renvoie (extrait)

Pour le poste fonctionnant

    java.home = /usr/lib/jvm/java-8-oracle/jre
    java.library.path = /usr/java/packages/lib/amd64
        /usr/lib64
        /lib64
        /lib
        /usr/lib

Pour le poste ne fonctionnant pas - sélection openjdk

    java.home = /usr/lib/jvm/java-11-openjdk-amd64
    java.io.tmpdir = /tmp
    java.library.path = /usr/java/packages/lib
        /usr/lib/x86_64-linux-gnu/jni
        /lib/x86_64-linux-gnu
        /usr/lib/x86_64-linux-gnu
        /usr/lib/jni
        /lib
        /usr/lib

Pour le poste ne fonctionnant pas - sélection jdk Oracle

   java.home = /usr/lib/jvm/jdk-15.0.1
    java.io.tmpdir = /tmp
    java.library.path = /usr/java/packages/lib
        /usr/lib64
        /lib64
        /lib
        /usr/lib

Les répertoires "lib" référencés ci-dessus contiennent tous le fichier libjawt.so.

Sous Eclipse l'application se lance correctement, je peux choisir le fichier à traiter, l'erreur se produit lorsque je veux visualiser la vidéo par la commande :

getMediaPlayer().play();

play() correspondant à la méthode play l'interface MediaPlayer de l'API VLCJ.

J'ai également rajouté quelques lignes dans mon code pour vérifier que le fichier libjawt.so existe, ce qui est le cas. De plus, si je regarde les propriétés de ce fichier dans le répertoire "lib" soit d'openjdk, soit de Oracle, j'ai un dernier accès correspondant à la date et heure du dernier lancement sous Eclipse.

Je n'ai maintenant plus d'idée.

Hors ligne

#6 Le 02/12/2020, à 20:36

soshy

Re : [Résolu]Java et VLC - chargement de librairies .so

Hello,

sur la machine qui ne fonctionne pas, tente ça :

LD_LIBRARY_PATH=/media/az/Data1To/LSFUtils-ws/vlcPlayer/src/lib:$LD_LIBRARY_PATH la_commande_habituelle_pour_lancer_ton_programme

Hors ligne

#7 Le 06/12/2020, à 16:25

Omega38

Re : [Résolu]Java et VLC - chargement de librairies .so

Bonjour,

Pour commencer, un grand merci pour ton aide.

Après avoir lancé la ligne de commande que tu proposes, je me retrouve dans la situation suivante : l'application ne fonctionne plus sur Eclipse, avec le même message d'erreur :

Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: libjawt.so: Ne peut ouvrir le fichier d'objet partagé: Aucun fichier ou dossier de ce type

Concernant les .jar, que ce soit celui créé avant le dysfonctionnement, ou celui que j'ai re-créé à partir des sources d'Eclipse "qui ne fonctionnent pas", histoire de voir si je n'avais pas changé le code au cours de mes divers essais, les deux fonctionnent parfaitement.

Sur le poste "de production", le jar fonctionne également après envoi de la ligne de commande (chemin bien entendu adapté au poste).

Si j'ai bien compris, on rajoute un chemin vers la librairie considérée comme manquante, mais pourquoi ce dysfonctionnement avec Eclipse? Par ailleurs pourquoi les autres librairies .so liées à VLC (libvlcxxxx.so) qui sont dans le même répertoire .../src/lib ne semblent pas manquer?

Hors ligne

#8 Le 06/12/2020, à 18:38

soshy

Re : [Résolu]Java et VLC - chargement de librairies .so

Je vais tâcher d'être clair dans mon explication, c'est pas forcément simple smile

En java, quand tu charges une dépendance, il faut qu'elle soit dans le classpath pour être "trouvée" et que le programme puisse s'exécuter. Là, tu es dans un cas un peu particulier où ta dépendance c'est pas un jar, mais une bibliothèque native (probablement compilé depuis du C ou C++). J'imagine que tu as un JAR qui fait appel à la bibliothèque native et qui wrap les fonctions pour les rendre utilisables en java.

En C, tes dépendances peuvent être soit du "static link" et donc là il faut que la bibliothèque soit dans un chemin spécifique avec un nom précis, soit elle est compilé avec du "dynamic linking". En gros tu dis que sur la plateforme qui exécutera le programme, il y aura une bibliothèque dynamique (shared object, d'où les .so) disponible dans le(s) répertoire(s) des bibliothèques partagées.  Et donc ton programme n'a pas à fournir cette bibliothèque. C'est un des avantages de linux où énormément de programmes sont compilés avec des bibliothèques partagées. Si une faille est détecté dans une bibliothèque partagée, la mise à jour de cette bibliothèque sera effective pour tous les logiciels qui utilisent la version partagée du système. Si le programme avait été compilé avec la lib en static, alors chaque programme aurait dû mettre à jour la lib, et beaucoup ne se seraient même pas donné la peine, ou avec beaucoup de retard. Ça évite aussi d'avoir 20 fois la même version d'une même lib.

Pour en revenir au nœud du problème, lorsque tu exécutes un programme, avant l'exécution du programme il y a ld qui est exécuté et qui se charge de retrouver toutes les références vers les bibliothèques dynamiques. Le truc, c'est que les répertoires standards où il va chercher la lib, et ben /media/az/Data1To/LSFUtils-ws/vlcPlayer/src/lib n'en fait pas partie smile
Donc c'est une des façons d'ajouter ce répertoire à la liste à parcourir pour trouver les bibliothèques "natives" (pas les jar java quoi). Il y en a d'autres, dont une probablement meilleure que celle que je t'ai fait essayer. Regarde ici, la 4ème solution est la plus propre d'après moi.

Maintenant, pour répondre à tes questions

Omega38 a écrit :

Par ailleurs pourquoi les autres librairies .so liées à VLC (libvlcxxxx.so) qui sont dans le même répertoire .../src/lib ne semblent pas manquer?

La ligne que je t'ai donné permet de trouver tous les .so du répertoire mentionné si le programme en a besoin. Et tu l'as dit toi même, c'est : le même répertoire

Omega38 a écrit :

pourquoi ce dysfonctionnement avec Eclipse?

Si ça fonctionnait initialement avec eclipse, c'est probable que :
- la déclaration des lib natives était correctement faite dans ton projet et que démarrer le projet depuis éclipse ajoutait tout ce paramétrage au lancement
- les différents *.so nécessaires étaient déjà présent sur le système et donc c'était pas ceux du projet qui étaient utilisés mais ceux du système.

Pour moi, soit tu as flingué la conf des lib natives dans ton projet, soit peut être tu as changé la JVM qui exécute eclipse et les lib natives disponibles ne sont pas les mêmes (java.library.path est différent).


Ps: je ne suis pas expert du C ni des bibliothèques natives donc il y a peut être des imprécisions voir des erreurs, mais l'idée générale doit être là smile

Dernière modification par soshy (Le 07/12/2020, à 20:12)

Hors ligne

#9 Le 07/12/2020, à 07:23

Omega38

Re : [Résolu]Java et VLC - chargement de librairies .so

Merci de ces explications très claires. Ta supposition sur le changement de JVM est sans nul doute la bonne puisque le problème est survenu après changement du disque "système", installation de Ubuntu 20.04 et donc forcément changement du JDK.
Je passe en résolu et je complète le titre du post pour qu'il soit plus explicite.
Merci à tous les deux de votre aide.

Dernière modification par Omega38 (Le 07/12/2020, à 07:26)

Hors ligne