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

Java Discussion :

DLL temporaire extrait du jar


Sujet :

Java

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Points : 126
    Points
    126
    Par défaut DLL temporaire extrait du jar
    Bonjour!

    Je développe un programme qui utilise Sigar, j'ai donc besoin d'un dll pour la faire fonctionner. J'aimerais que ce dll soit dans le jar directement et je sais que c'est possible, mais seulement après l'avoir copié hors du jar. J'ai alors pack mon dll dans mon jar et c'est là que je bloque, je n'arrive pas à copier le contenu de mon fichier source dans le nouveau (qui se créé mais qui reste vide)... Par ailleurs je ne sais pas trop sûr de comment faire un fichier temporaire, même après avoir cherché sur le net.
    Mon dll s'appelle "sigar-amd64-winnt.dll"

    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    	//-------------------------------------------------------
    	//Loading Required Libraries
    	//-------------------------------------------------------
    	public static void loadDLL() throws IOException { 
     
            try {
     
                    InputStream in = Main.class.getResourceAsStream("sigar-amd64-winnt.dll");
     
                    File fileOut = new File("sigar-amd64-winnt.dll");
     
                    OutputStream out = FileUtils.openOutputStream(fileOut);
                    IOUtils.copy(in, out);
                    in.close();
                    out.close();
                	System.out.println("Required library successfully loaded!");
            } catch (Exception e) {
            	System.out.println("Failed to load required library...");
            }
    	//Loading Library
    		try {
    	        System.loadLibrary("sigar-amd64-winnt.dll");
    	    } catch (UnsatisfiedLinkError e) {
     
    	    }
        //-------------------------------------------------------	
    	}
    J'utilise Apache pour me faciliter la copie. (sans succès XD)

    J'espère que vous pourrez m'aider.

  2. #2
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Je ne sais pas ce que fait ces méthodes d'Apache, mais si le fichier est vide il y a des chances que ce soit à cause d'un buffer, et qu'il faille flusher l'output pour forcer l'écriture.

    Toutefois j'aurais plusieurs remarques sur ton code :
    • La gestion des exceptions fait peur, entre les exception ignorés et celle qui se contente d'afficher un message avant de continuer le traitement...
    • Tu fermes les flux, c'est bien, mais il faudrait le faire via le try-with-ressource de Java 7, ou via des try/finally sinon.
    • Tu places le fichier dans le répertoire courant... mais ce dernier n'est pas forcément dans la liste des répertoires du library-path, donc rien ne dit que ta DLL sera bien chargé.
    • System.loadLibrary() attend un nom logique de librairie... sous windows cela correspond au nom dans le ".dll"...
      Comme tu connais le nom exact du fichier, tu devrais plutôt utiliser System.load()


    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    	private static void loadDLL() throws IOException {
    		// 1. On crée un fichier temporaire :
    		File tempFile = File.createTempFile("temp", ".dll");
    		// 2. On recopie le fichier depuis le jar vers le fichier temporaire
    		try (InputStream input = Main.class.getResourceAsStream("sigar-amd64-winnt.dll");
    			OutputStream output = new FileOutputStream(tempFile)) {
    			byte[] buf = new byte[8192];
    			int len;
    			while ( (len=input.read(buf)) > 0 ) {
    				output.write(buf, 0, len);
    			}
    			output.flush();
    		}
    		// 3. On marque le fichier afin que le JVM le supprime à la fermeture
    		tempFile.deleteOnExit();
    		// 4. On charge directement ce fichier
    		System.load(tempFile.getAbsolutePath());
    	}

    [edit] Et bien sûr il faudrait gérer un chargement de librairie différente selon le système et l'architecture...


    a++

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Si le fichier est vide, c'est probablement parce que tu gère tes exceptions n'importe comment et, du coup, tu n'a pas vu le NullPointerException lancé par IOUtils, qui est du au fait que is est null, lui même du au fait que la dll n'est pas présente à l'endroit où tu la cherche, vraisemblablement. Tu l'a bien mise à coté de ton Main.class, pas dans une autre dossier??

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Points : 126
    Points
    126
    Par défaut
    Oui en effet j'ai oublié de demander le printstacktrace.
    Merci pour tes conseils adiGuba! Je m'occuperais du multi-plateforme plus tard par contre. ^^

    Pour répondre à tchize, j'avais cherché un peu sur internet et j'ai vu qu'il serait préférable de stocker ma librairie dans un dossier à part que j'ai nommé "libraries". Si j'ai bien compris il faudrait que je créé une classe vide dans ce dossier et que je remplace "Main.class..." par ma nouvelle classe. Je ne vois pas spécialement ce qu'apporte l'ajout d'un dossier supplémentaire dans un aussi petit programme mais bon, peut-être que ça a une importance...

    Par contre, avec le code de adiGuba, temp.dll ne se crée pas (du moins je ne le vois pas; j'ai tenté un export et en effet ça ne fonctionne pas)
    J'ai fait le petit remplacement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    	public static void loadDLL() throws IOException { 
    	//Creating temp file
    		File tempFile = File.createTempFile("temp", ".dll");
     
    		try (InputStream input = GetLibraries.class.getResourceAsStream("sigar-amd64-winnt.dll");
    			OutputStream output = new FileOutputStream(tempFile)) {
    			byte[] buf = new byte[8192];
    			int len;
    			while ( (len=input.read(buf)) > 0 ) {
    				output.write(buf, 0, len);
    			}
    			output.flush();
    		}
     
    		tempFile.deleteOnExit();
     
    	//Loading Library
    		System.load(tempFile.getAbsolutePath());
        //-------------------------------------------------------	
    	}
    Précision: J'ai deux packages comme je l'ai dit juste avant: celui avec mon code et celui avec mon dll, d'où le GetLibraries.class.
    Avec ça je n'ai plus la NullPointerException ( après avoir corrigé mes idioties ça marche mieux ^^)

  5. #5
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par JeremGamer Voir le message
    Par contre, avec le code de adiGuba, temp.dll ne se crée pas (du moins je ne le vois pas; j'ai tenté un export et en effet ça ne fonctionne pas)
    Tu n'auras pas de fichier "temp.dll", mais un fichier temporaire dont le nom commence par "temp" et fini par ".dll".
    La JVM mettra quelque chose au milieu afin de s'assurer de ne pas écraser un autre fichier...


    As-tu vérifié précisément à l'emplacement du fichier ? Et avant la fin du programme ?


    Et que veux-tu dire par "j'ai tenté un export et en effet ça ne fonctionne pas" ???


    a++

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Points : 126
    Points
    126
    Par défaut
    Je travaille avec Eclipse et le fichier temporaire se créé donc à un emplacement que je ne connais pas! (Le programme se lance comme il faut dessus mais une fois exporté, ça ne fonctionne plus. Normal vu que Eclipse donne directement le chemin vers mon dll^^)

    Le fichier est sensé se créer dans le dossier où se trouve le jar? Si oui, il n'apparait pas.

    edit: J'ai vérifié pendant que le programme tournait avec Eclipse

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par JeremGamer Voir le message
    Pour répondre à tchize, j'avais cherché un peu sur internet et j'ai vu qu'il serait préférable de stocker ma librairie dans un dossier à part que j'ai nommé "libraries". Si j'ai bien compris il faudrait que je créé une classe vide dans ce dossier et que je remplace "Main.class..." par ma nouvelle classe.
    Heu non, tu n'a pas à créer une classe vide. Mais dans getResourceAsStream, il faut mettre un chemin correct:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InputStream input = Main.class.getResourceAsStream("/librairies/sigar-amd64-winnt.dll")

  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Points : 126
    Points
    126
    Par défaut
    Sans en créer une, même en mettant le chemin correct j'ai une NullPointerException. Sinon je met ma librairie dans le même dossier ce sera plus simple.

  9. #9
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par JeremGamer Voir le message
    Je travaille avec Eclipse et le fichier temporaire se créé donc à un emplacement que je ne connais pas!
    Il se crée dans un dossier temporaire... ce qui dépendra de ta configuration.
    Un simple System.out.println(tempFile) te donnera le chemin vers le fichier...

    Citation Envoyé par JeremGamer Voir le message
    (Le programme se lance comme il faut dessus mais une fois exporté, ça ne fonctionne plus.
    Que veux-tu dire par "exporté" précisément ?
    Que veux-tu dire par "ne fonctionne plus" ? Tu as une exception ? Si oui laquelle ?


    a++

  10. #10
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par JeremGamer Voir le message
    Sans en créer une, même en mettant le chemin correct j'ai une NullPointerException.
    Si tu as un null c'est que le chemin n'est pas correct...


    a++

  11. #11
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Points : 126
    Points
    126
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Il se crée dans un dossier temporaire... ce qui dépendra de ta configuration.
    Un simple System.out.println(tempFile)
    Merci pour l'astuce! Le fichier se crée bien, est rempli, mais ne se supprime pas à la fermeture du programme.
    J'ai bien mis ça pourtant: tempFile.deleteOnExit();Désolé pour mon vocabulaire, je voulais dire compilé.
    J'ai juste un message:
    no sigar-amd64-winnt.dll in java.library.path
    Puis un autre comme quoi Sigar à été stoppé.

  12. #12
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    C'est tout ? Pas très parlant...
    C'est un message généré par ton programme ou pas ?
    Tu n'as pas une exception et un stacktrace ?


    a++

  13. #13
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Cette erreur viens de ton code (donc de la méthode que tu nous montre) ou elle viens de cigar même quand tu l'appelle après?

  14. #14
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Points : 126
    Points
    126
    Par défaut
    Elle vient de Sigar

    edit: Voici un screenshot ça vous parlera plus!
    Nom : screenshot.png
Affichages : 196
Taille : 20,2 Ko
    Et pourtant le fichier s'est bien créé dans mon dossier Temp

  15. #15
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Dans ce cas c'est sigar qui est mal foutu. Il cherche d'office à charger la dll depuis les librairies système, foire son initialsation statique et après c'est le bordel. Tu peux essayer de contourner le problème en faisant ceci:

    après l'extraction de la dll:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.setProperty("java.library.path",tempFile.getParent());
    Et du coup, ne pas charger la librairie toi même, sinon tu risque d'autre exception vu le double chargement que tu aura

  16. #16
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Points : 126
    Points
    126
    Par défaut
    Ça ne résout pas le problème
    Quand je faisais mes tests, le dll était dans le même dossier que le jar et il se chargeait très bien.
    Serait-il possible de créer un ficher temporaire dans le même dossier que le jar? (Ou alors créer un fichier à supprimer manuellement à la fermeture du programme?)

    edit: Je ne comprend pas pourquoi le fichier ne se supprime pas après la fermeture du programme alors que j'ai bien mis tempFile.deleteOnExit();
    edit2: J'ai changé un peu mon code pour créer le fichier dans le même dossier que mon jar:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    	//-------------------------------------------------------
    	//Loading Required Libraries
    	//-------------------------------------------------------
    	public static void loadDLL() throws IOException { 
    	//Creating temp file
    		File tempFile = new File("JCMTemp.dll"); // J'ai changé le nom de mon fichier mais ça n'a pas d'importance.
     
    		try (InputStream input = Main.class.getResourceAsStream("sigar-amd64-winnt.dll");
    			OutputStream output = new FileOutputStream(tempFile)) {
    			byte[] buf = new byte[8192];
    			int len;
    			while ( (len=input.read(buf)) > 0 ) {
    				output.write(buf, 0, len);
    			}
    			output.flush();
    		}
    		tempFile.deleteOnExit();
     
    	//Loading Library
    		System.load(tempFile.getAbsolutePath());
        //-------------------------------------------------------	
    	}
    Il me notifie toujours la même chose. J'ai essayé System.loadLibrary("JCMTemp.dll"); dans la méthode main. Résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Exception in thread "main" java.lang.UnsatisfiedLinkError: Expecting an absolute path of the library: JCMTemp.dll
    	at java.lang.Runtime.load0(Unknown Source)
    	at java.lang.System.load(Unknown Source)
    	at main.Main.main(Main.java:126)
    Il ne manque plus qu'a lui donner le chemin. Mais je ne sais pas comment faire vu que je ne peux pas l'obtenir depuis mon objet tempFile.

  17. #17
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par JeremGamer Voir le message
    Ça ne résout pas le problème
    Tu as toujours EXACTEMENT la même erreur?
    Citation Envoyé par JeremGamer Voir le message
    Quand je faisais mes tests, le dll était dans le même dossier que le jar et il se chargeait très bien.
    Dans le répertoire courant, pas dans le même répertoire que le jar. Le répertoire courant fait partie des chemins de recherche par défaut.
    Citation Envoyé par JeremGamer Voir le message
    Serait-il possible de créer un ficher temporaire dans le même dossier que le jar? (Ou alors créer un fichier à supprimer manuellement à la fermeture du programme?)
    Ca fait cochon comme méthode, sans compter que ça suppose que tu aie les droits d'accès.
    Citation Envoyé par JeremGamer Voir le message
    edit: Je ne comprend pas pourquoi le fichier ne se supprime pas après la fermeture du programme alors que j'ai bien mis tempFile.deleteOnExit();
    C'est que tu l'a chargé avec ton code et donc le fichier est verrouillé jusqu'à fermeture de l'application. Par contre, c'est incohérent, comment tu pourrais avoir l'erreur et en même temps être arrivé à le charger?? As-tu bien retiré le code de chargement comme mentionné. Je répète ma demande, est-ce que l'erreur est EXACTEMENT la même?
    Citation Envoyé par JeremGamer Voir le message
    Il me notifie toujours la même chose. J'ai essayé System.loadLibrary("JCMTemp.dll"); dans la méthode main. Résultat:
    [CODE]Exception in thread "main" java.lang.UnsatisfiedLinkError: Expecting an absolute path of the library: JCMTemp.dll
    at java.lang.Runtime.load0(Unknown Source)
    at java.lang.System.load(Unknown Source)
    Donc je réitère pour la troisième fois ma question: Exactement la même erreur. Parce que ça, c'est pas exactement la même erreur. Comme déjà dit, et comme l'erreur le dit, là t'as filé n'importe nawak à loadLibrary et cette erreur n'a plus rien à voir avec l'erreur d'origine qui se trouvait dans cigar.


    Donc,
    on retourne à la case départ. Tu crée le fichier dans un dossier temporaire avec exactement le même nom, tu change le java.library.path comme mentionné, tu ne charge rien toi même, tu te contente de lancer cigar, et tu nous file l'erreur complète que tu as éventuellement.

    Parce que là, pas la moindre idée d'où on en est avec les informations que tu donne.

  18. #18
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Points : 126
    Points
    126
    Par défaut
    Excusez-moi, j'essaierais d'être plus précis par la suite.

    Je suis retourné à ça comme demandé(sans rien d'autre derrière):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    	//-------------------------------------------------------
    	//Loading Required Libraries
    	//-------------------------------------------------------
    	public static void loadDLL() throws IOException { 
    	//Creating temp file
    		File tempFile = File.createTempFile("JCMTemp", ".dll");
     
    		try (InputStream input = Main.class.getResourceAsStream("sigar-amd64-winnt.dll");
    			OutputStream output = new FileOutputStream(tempFile)) {
    			byte[] buf = new byte[8192];
    			int len;
    			while ( (len=input.read(buf)) > 0 ) {
    				output.write(buf, 0, len);
    			}
    			output.flush();
    		}
    		tempFile.deleteOnExit();
     
    	//Loading Library
    		System.load(tempFile.getAbsolutePath());
        //-------------------------------------------------------	
    	}
    J'ai bien exactement la même erreur avec ce code:
    Nom : screenshot2.png
Affichages : 170
Taille : 34,7 Ko

  19. #19
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    c'est pas ce que j'ai demandé, je t'ai demandé de faire ça:
    Tu crée le fichier dans un dossier temporaire avec exactement le même nom, tu change le java.library.path comme mentionné, tu ne charge rien toi même, tu te contente de lancer cigar, et tu nous file l'erreur complète que tu as éventuellement
    là non seulement tu crée le fichier avec un autre nom, mais tu ne modifie pas java.library.path et tu charge toi même la dll. C'est tout le contraire de ce que je t'ai demandé de faire. donc ton fichier DOIT s'appeler sigar-amd64-winnt.dll puisque, comme tu vois le message d'erreur, c'est ce que le code interne à cigar essaie désespérément de charger, le dossier contenant ce fichier DOIT se trouver dans java.library.path puisque, toujours d'après le message d'erreur, c'est là dedans qu'on le charge. Et enfin, tu ne DOIS PAS le charger toi même, parce qu'on ne peux pas charger deux fois la même dll, laisse cigar se charger du System.load().

    Tu n'as pas l'air de comprendre que le problème à la base ce n'est pas vraiment ton appel à System.load, tu charge bien la librairie avec ça, le problème c'est que cigar demande aussi, de son coté, à java, de charger "sigar-amd64-winnt.dll" depuis le library path, et ça c'est impossible tant que tu n'aura pas extrait ta librairie sous le bon nom et que tu n'a pas référencé le dossier contenant la librairie dans le java.library.path.

  20. #20
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Points : 126
    Points
    126
    Par défaut
    Désolé j'étais pas bien réveillé! XD
    J'ai lu retour à la case départ et du coup...

    Ok mais comment je fais pour créer mon fichier dans java.library.path?

    edit: Je crois savoir d'où provient le problème: Il semble que Sigar essaie de charger la librairie avant que je ne l'ai exportée du jar. C'est pourtant la première action que j'effectue dans ma méthode main. :/

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/11/2011, 18h23
  2. Intégration des dll dans un fichier JAR
    Par dot-_-net dans le forum Général Java
    Réponses: 1
    Dernier message: 02/03/2011, 04h27
  3. Réponses: 5
    Dernier message: 29/07/2009, 15h04
  4. Problème de DLL dans un fichier jar
    Par Guigui985 dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 14/10/2008, 18h15
  5. Réponses: 3
    Dernier message: 24/11/2006, 11h12

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