2010-03-31 16 views
6

SfondoCaricamento della lib di JNI su Mac OS X?

Così sto cercando di caricare un jnilib (in particolare JOGL) in Java su Mac OS X in fase di esecuzione. Ho seguito lungo le pertinenti domande Stack Overflow:

L'obiettivo finale per me è quello di confezionare i file JOGL specifici di piattaforma in un vaso e li decomprimere in una directory temporanea e caricarli all'avvio. Ho lavorato il mio problema alla schiena semplicemente il tentativo di caricare JOGL utilizzando percorsi hard-coded:

File f = new File("/var/folders/+n/+nfb8NHsHiSpEh6AHMCyvE+++TI/-Tmp-/libjogl.jnilib"); 
    System.load(f.toString()); 
    f = new File ("/var/folders/+n/+nfb8NHsHiSpEh6AHMCyvE+++TI/-Tmp-/libjogl_awt.jnilib"); 
    System.load(f.toString()); 

ottengo la seguente eccezione quando si tenta di utilizzare l'API JOGL:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no jogl in java.library.path 

Ma quando ho specificare java.library.path da aggiungendo la seguente opzione JVM:

-Djava.library.path="/var/folders/+n/+nfb8NHsHiSpEh6AHMCyvE+++TI/-Tmp-/" 

tutto funziona bene.


Domanda

E 'possibile l'uso System.load (o qualche altra variante) su Mac OS X come un sostituto per -Djava.library.path che viene richiamato in fase di esecuzione?

risposta

1

Jogl tenta sempre di caricare automaticamente tutte le librerie dipendenti. Per evitare questo, ci dovrebbe essere una classe NativeLibLoader in cui è possibile chiamare disableLoading() prima di caricare le librerie da soli tramite System.load()

+0

Dolce! Grazie per questo, chiamare NativeLibLoader.disableLoading() prima di caricare manualmente le librerie ha funzionato brillantemente. – Clinton

-3

System.load(...) accetta libraryName come argomento. Non prende il percorso di libreria come argomento. JVM cerca una libreria con nome specificato nell'elenco dei percorsi specificato in -Djava.library.path;

Qui non c'è nulla di specifico per Mac OS X. Cerca le librerie nello stesso modo su tutti i sistemi operativi.

+2

che in realtà non è corretto, System.load() assumerà il nome file completo e System.loadLibrary prenderà il nome di lib – sreejith

+0

Penso che il caricamento di jnilib sia specifico per Mac (è nel mio caso). Lo sto lavorando su Linux (.so), in mac dopo la compilazione jnilib non viene caricato. Io uso mvn jetty: deploy-war -Djava.library.path =/path/to/jnilib. Ho persino usato System.setProperty ("mylib.systemclassloader", "false"); in modo che possa essere eseguito in un ambiente servlet (disabilita il caricamento automatico di tale libreria). Quale potrebbe essere la causa? – Pramod

2

Non è necessario fornire java.library.path all'avvio. È possibile impostare a livello di codice con

System.setProperty("java.library.path", "/var/folder/bla/foo/bar/"); 

Non so se System.load() funzionerà in qualche modo senza questo percorso di libreria.

+1

Grazie per il suggerimento. Tuttavia nella mia esperienza l'impostazione di "java.library.path" in fase di esecuzione non ha avuto alcun effetto.Penso che questo potrebbe essere dovuto a motivi simili al motivo per cui non è possibile modificare il classpath in fase di esecuzione: http://stackoverflow.com/questions/271506/why-system-setproperty-cannot-change-the-classpath-at-run -time – Clinton

+0

Quindi potresti avere avuto un altro problema con una libreria dipendente. L'impostazione del percorso della lib in runtime funziona perfettamente, ho usato per caricare le mie librerie proprio così. –

+0

Non è proprio vero, c'è un modo per forzare la reinizializzazione del classloader con il nuovo lib.path. – Zorkus