Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    76

    caricare file dll da una libreria

    Ciao, vi espongo il mio problema. Ho un programma, che fa uso di una certa libreria lib da me creata. La mia libreria per funzionare deve caricare a runtime delle librerie dll di windows con il system.load. Cio che io vorrei, è distribuire la mia libreria in una cartella in cui c'è il file lib.jar e la cartella dlls con tutte le dll, e che una generica classe Init della mia libreria carichi tali librerie all'inizio. In questo modo, risparmierei l'onere per il programmatore di dover caricare lui le librerie dll, e farlo fare in background ad un metodo della classe Init. Tuttavia mi chiedo, come sia possibile dalla classe Init della mia libreria(file jar) reperire il path dei file dll in modo tale da caricarli con la System.load..spero di essere stato chiaro....

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    76
    Nessuno mi sa aiutare? Ditemi se non ho spiegato bene il mio problema...

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: caricare file dll da una libreria

    Originariamente inviato da alf83
    Tuttavia mi chiedo, come sia possibile dalla classe Init della mia libreria(file jar) reperire il path dei file dll in modo tale da caricarli con la System.load..
    A load() va passato un filename completo (path+nome+estensione) es. C:\blabla\mialib.dll

    Le soluzioni sono diverse e a livelli diversi:
    a) Realizzare un "installer" che si preoccupi, tra le altre cose, di copiare la dll in una directory nota al sistema o già in PATH (es. la directory di Windows) oppure di copiarla dovunque (anche nella directory di installazione del programma) preoccupandosi però di aggiornare la variabile di ambiente PATH. In tal caso (dll già in PATH) basta usare loadLibrary() e non load().

    b) Lasciare all'utente il compito di mettere la dll in una directory che è in PATH. Anche in questo caso è sufficiente loadLibrary().

    c) Alcune librerie Java che usano JNI fanno una cosa abbastanza "furba". La dll è fisicamente dentro il jar e all'atto della inizializzazione la libreria stessa legge il jar come "risorsa" e la scrive su file in una directory "nota", ad esempio la directory temporanea rintracciabile dalla system property "java.io.tmpdir". A quel punto hai il path e hai la dll presente in quel path!
    Se la libreria è usabile su diversi sistemi, avrà diverse librerie native (es. .dll su Windows, .so su Linux). Chiaramente deve determinare il S.O. per sapere quale estrarre!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    76
    Ciao e grazie della risposta...tra le opzioni che mi hai suggerito, quella per me piu interessante è la c. Tuttavia una cosa mi sfugge: tu mi dici di leggere il jar come risorsa e mettrne il path in una variabile nota. Mi chiedo 1: come faccio a ricavare il path della risorsa .jar? (Io ho provato a fare qualcosa del genere sfruttando il metodo getResource della classe Class; ad esempio data la classe Init della mia libreria, faccio Init.class.getResource(Init.class) e ottengo l'URL della classe. Mi chiedo come fare la stessa cosa per il jar, e come poi riportare l'URL in un oggetto java.io.File.) 2: mi pare di aver letto da qualche parte che nn è possibile reperire una dll dentro un jar...

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da alf83
    come faccio a ricavare il path della risorsa .jar?
    Sfruttando il concetto delle "risorse", non serve sapere il path del file .jar! Perché usa lo stesso criterio che viene usato per trovare le classi.

    Originariamente inviato da alf83
    Io ho provato a fare qualcosa del genere sfruttando il metodo getResource della classe Class; ad esempio data la classe Init della mia libreria, faccio Init.class.getResource(Init.class)
    getResource riceve un String con il nome della risorsa (quindi avresti dovuto mettere Init.class tra " ") allora sì, avresti l'URL di Init.class.

    Es.
    Init.class.getResource("pippo.gif")

    Allora pippo.gif deve essere nello stesso package della classe Init. Tutto qui.

    Originariamente inviato da alf83
    Mi chiedo come fare la stessa cosa per il jar, e come poi riportare l'URL in un oggetto java.io.File.
    Nel caso specifico di estrazione di una risorsa e scrittura su file, non conviene usare getResource (ritorna un URL) ma getResourceAsStream (ritorna un InputStream). Quindi si legge a blocchi di byte (per avere buone prestazioni .... potresti anche leggere/scrivere 1 byte per volta ma .... beh, immagina) e li si scrive su un FileOutputStream.

    Originariamente inviato da alf83
    mi pare di aver letto da qualche parte che nn è possibile reperire una dll dentro un jar...
    La JVM e in generale il S.O. non sono in grado di caricare una libreria nativa dentro un jar/zip o qualunque altra cosa. Insomma ... non lo fanno, non è previsto.
    Ma se usi getResource/getResourceAsStream puoi virtualmente ottenere un URL/InputStream di qualunque cosa sia in "classpath".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    76
    Ciao, mi è tutto chiaro. Ti volevo chiedere un ultima cosa: ho capito il ragionamento che tu hai fatto; tuttavia se io volessi evitare di leggere come uno stream di input le mie dll e poi doverle riscrivere in una directory temporanea? cioè, vorrei semplicemente dalla mia classe Init della mia libreria, reperire il path della dll e caricarla con il System.load. A tal fine, non è importante se le dll non dovessero stare all'interno del file .jar; mi andrebbe bene anche se io distribuissi una cartella dir, all'interno della quale metto sia il jar della mia libreria e una cartella lib con le mie dll. Ecco, quello che mi manca è sapere(e se è possibile) come caricare tali dll, ottenerne un oggetto java.io.File sempre ovviamente dalla mia classe Init della libreria. GRAZIE

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da alf83
    cioè, vorrei semplicemente dalla mia classe Init della mia libreria, reperire il path della dll e caricarla con il System.load.
    La questione di determinare il path di un file relativo alla locazione della tua applicazione si può risolvere ma bisogna vedere quale "appiglio" usare per trovare il path.

    Se lanci la applicazione o comunque stabilisci che la applicazione venga sempre lanciata facendo in modo che la directory "corrente" sia quella dove hai ad esempio il jar ... beh, ecco l'appiglio ce l'hai già e ti puoi costruire tutti i path relativi a tale directory.

    Se l'applicazione viene lanciata "avviando" direttamente il jar, allora il "classpath" principale è composto solo dal jar stesso e la locazione (path+nome) del jar la trovi nella system property "java.class.path" (non so però quanto sia standard e "portabile").
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.