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.
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.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);
Invito chiunque a mostrarmi un modo migliore per ottenere il risultato prefisso perchè questo non è che mi entusiasmi. Grazie![]()