IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Java Discussion :

Charger une bibliothèque .so


Sujet :

API standards et tierces Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 139
    Par défaut Charger une bibliothèque .so
    Bonjour,

    J'essaie de charger une bibliothèque .so (sous Linux) avec l'appel suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     static {
            System.loadLibrary("lib");
    }
    Sous Eclipse, j'ai ajouter lib.so dans le classpath en faisant :

    - clic droit sur le projet
    - Properties
    - Java build path, onglet Libraries
    - Add JARs.

    Mais au moment du load, j'arrive à faire un affichage avant, mais pas après. J'imagine qu'il y a un problème au niveau du system load, ou dans l'inclusion d'un JAR sous la forme d'un .so...

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Les librairies ne font pas partis du classpath mais du PATH système...

    Où est située ta librairie, et comment se nomme-t-elle précisément ?
    Tu dois avoir une exception... Peux-tu donner le stacktrace ?

    a++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 139
    Par défaut
    C'est du JNI, mes sources Java se trouvent dans le source folder src/java, et mon .so dans le source folder src/C.

    Bizarrement je n'ai pas d'exception de lancée. Il y a un blocage dans le load library. Voici mon code pour être plus précis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     static {
            logger.info("Load de l'APi : tentative ");
            try {
                System.loadLibrary("lib");
            } catch (final Exception e) {
                logger.error(" Erreur : ");
                logger.error(e.toString());
            }
            logger.info("Load de l'API Ok"); 
        }
    (le type de logger est un Logger du package org.slf4j).
    Je vais essayer de mettre le chemin absolu du répertoire où est lib.so dans mon PATH système.

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Vires le try/catch. Cela te permettra de bien voir l'exception remontée...

    Sinon pour loadLibrary("lib") ton fichier doit se nommer "liblib.so" pour respecter les conventions du système !
    Et tu ne dois pas mettre le fichier dans le path, mais le répertoire qui le contient.


    Si cette librairie est fournis avec ton application, il est préférable d'utiliser System.load() avec le chemin complet vers le fichier...


    a++

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 139
    Par défaut
    J'ai viré le bloc try/catch, vérifié le nom de ma lib, ajouter le chemin absolu du répertoire contenant ma lib, ce n'est pas bon.

    Ensuite, j'ai testé le Load avec le chemin absolu de ma lib : CHEMIN/lib.so. Là, ça fonctionne comme il faut. Bizarre...

    En tout cas, merci de ton aide.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 139
    Par défaut
    Par contre, ça marche si je met le chemin absolu dans mon projet, mais je voudrais mettre un chemin relatif pour que le code soit un minimum portable.

    L'arborescence du projet suit la configuration suivante :
    - Deux sources folder dans Eclipse : src/java/ et src/C.
    - Un package dans le source folder java : monPackage.prem. C'est dans ce package que se trouve la classe faisant le load.
    - Un répertoire dans le source folder C : monRep. Ce répertoire contient liblib.so.

    Donc il faudrait, pour mettre un chemin relatif que je load "../../../C/MonRep/liblib.so", non ? ça ne marche pas de cette façon. Pas d'autre idée ?

Discussions similaires

  1. Charger dynamiquement une bibliothèque sous Linux
    Par Dominique49 dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 03/07/2012, 10h28
  2. Réponses: 19
    Dernier message: 26/04/2004, 08h54
  3. [GNU Pascal] [GRX] Charger une police en mode graphique
    Par seedle-san dans le forum Autres IDE
    Réponses: 2
    Dernier message: 17/04/2004, 03h06
  4. Réponses: 2
    Dernier message: 20/01/2004, 14h27
  5. Réponses: 4
    Dernier message: 14/10/2003, 08h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo