Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [JAVA] Problema con java.library.path

    Credo che questo sia un problema abbastanza comune quando si usano librerie che fanno uso delle jni tuttavia la ricerca sul forum non mi ha aiutato.
    Ho un connector da java a db firebird (jaybird) che è composto da due file, il jar con le classi e la solita dll esterna al jar. Ora se uso la libreria includendo il jar e la nella stessa cartella in cui si trova la classe da cui la uso nessun problema, ma se sposto al libreria e la dll dentro una sottocartella lib appare la solita fastidiosa eccezione java.lang.UnsatisfiedLinkError: no jaybird2 in java.library.path. Ho provato in ogni modo ad impostare la variabile library path e la cosa funziona se la imposto in maniera statica coem argomento alla jvm del tipo -Djava.library.path=path_assoluto_libreria.
    Io però vorrei poter impostare dinamicamente a runtime la variabile e soprattutto mi piacerebeb farlo da codice. Ho già provato roba del tipo
    codice:
    currPath = Class.forName("AppFrame").getProtectionDomain().
                getCodeSource().getLocation().getPath().toString();
                System.setProperty("java.library.path",currPath + "lib");
    e numerose varianti ma nulla! Qualcuno sa aiutarmi?
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  2. #2
    E' veramnete allucinante che per risolvere un problema del genere uno debba fare i salti mortali.Ho sudato sette camicie ed alla fine ci sono riuscito.
    Riepilogando brevemente il problema consiste nell'includere una sottocartella della cartella in cui gira il programma nella variabile java.library.path in modo che le dll in essa incluse siano visibili e utilizzabili.In particolare ci si prefigge di risolvere il problema in maniera dinamica cioè modificando la variabile java.library.path da codice e sulla base della cartella corrente del programma, quindi NON passando un percorso assoluto e statico all jvm.Questo è il codice.

    codice:
     //codice necessario a resettare la property nel classloader
                //che dopo l'avvio se la salva e usa il valore salvato rendendo
                //vane successive modifiche
       Class loaderClass = ClassLoader.class;
                Field userPaths = loaderClass.getDeclaredField("sys_paths");
                userPaths.setAccessible(true);
                userPaths.set(null, null);
    
    
                //recupero path corrente dell'applicazione
                String currPath = new File(getClass().getProtectionDomain()
                      .getCodeSource().getLocation().toURI()).getAbsolutePath();
                
                //e aggiungo il percorso della cartella con le dll
                String libFolderPath = currPath + File.separatorChar + "lib";
    
                //aggiungo la nuova cartella alla variabile java.library.path
                String libraryPath = System.getProperty("java.library.path")
                        .concat(";" + libFolderPath);
                System.setProperty("java.library.path", libraryPath);
    E' abbastanza commentato ma spiego a grandi linee cosa faDa quanto ho capito leggendo sul sito della sun il class loader legge questa variabile una volta all'avvio del programma e poi ne salva il valore in un campo interno usando quello successivamente e rendendo quindi vane eventuali modifiche alla variabile.Pertanto bisogna resettare quel valore per poterlo reimpostare. Il percorso da aggiungere al valore corrente della variabile java.library.path deve essere di tipo assoluto. Anche qui occorre fare un bel po di casino per ottenere il percorso completo del programma. Grazie al classloader comunque si riesce ad ottenerl in forma di url e poi per convertirlo in forma "normale" se non si vuole usare decode di URLEncoder (che è deprecato) si può fare come ho fatto io.

    Invito chiunque a mostrarmi un modo migliore per ottenere il risultato prefisso perchè questo non è che mi entusiasmi. Grazie
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Ciao: ho visto il thread adesso: non ti conviene recuperare la directory di lavoro con getProperty("user.dir") a cui andrai ad aggiungere gli eventuali paths (packages etc, etc)?
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  4. #4
    Originariamente inviato da Andrea1979
    Ciao: ho visto il thread adesso: non ti conviene recuperare la directory di lavoro con getProperty("user.dir") a cui andrai ad aggiungere gli eventuali paths (packages etc, etc)?
    Ok già una miglioria, in effetti pensavo che quella property contenesse la posizione della home directory dell'utente non la dir di lavoro, mea culpa per non ever verificato,Tuttavia mi riferivo più al problema dell'impostare la prtopery java.library.path che a questo quando ho chiesto una soluzione migliore.Hai idee?
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    ho una mezza soluzione:

    codice:
    System.load("X:/Percorso_libreria/libreria.dll");
    Ma c'è da fare del tweaking perché sembra non funzionarmi con i percorsi con spazi inclusi
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Ritratto la mia precedente affermazione sugli spazi...

    questo funziona

    codice:
    String path = "E:\\Documents and Settings\\Andrea\\Documenti\\JBuilder Projects\\PDFMaker";
        System.load(path+"\\jdic.dll");
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  7. #7
    Originariamente inviato da Andrea1979
    Ritratto la mia precedente affermazione sugli spazi...

    questo funziona

    codice:
    String path = "E:\\Documents and Settings\\Andrea\\Documenti\\JBuilder Projects\\PDFMaker";
        System.load(path+"\\jdic.dll");
    Si anche io ho provato per prima cosa con System.loadLibrary e mi funziona tranquillamente, però volevo evitare di caricare esplicitamente la dll visto che già lo fa il jar della libreria associata se java.library.path è impostato correttamente.Comunque ti ringrazio dell'aiuto.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.