2009-07-15 6 views
13

Ho diverse classi che utilizzano la stessa libreria JNI, chiamata "jni". In ciascuna di tali classi, ho una() chiamata System.loadLibrary nel inizializzatore statico della classe:Impedisci a Java di caricare la libreria più di una volta

Class class1 { 
    static{ 
     System.loadLibrary("jni"); 
    } 
    ... 
} 

Class class2 { 
    static{ 
     System.loadLibrary("jni"); 
    } 
    ... 
} 

L'unico problema è, voglio solo System.loadLibrary() per essere chiamata una volta, dal momento che può prendere un po. Esiste un modo semplice e pulito per prevenire più caricamenti della stessa libreria?

risposta

30

Se la libreria è già stata caricata, tutte le chiamate successive per caricare la stessa libreria verranno ignorate.

System.loadLibrary:

carica la libreria di sistema specificato dal l'argomento libname. Il modo in che un nome di libreria è mappato alla libreria di sistema attuale è il sistema dipendente.

La chiamata System.loadLibrary (nome) è efficacemente equivalente alla chiamata

Runtime.getRuntime().loadLibrary(name) 

Runtime.loadLibrary:

carica la libreria dinamica con il nome della libreria specificato . Un file contenente codice nativo viene caricato da il file system locale da un luogo in cui i file di libreria sono convenzionalmente ottenuti da . I dettagli di questo processo dipendono dall'implementazione. Il mapping da un nome di libreria a un nome file specifico viene eseguito in un modo specifico del sistema .

Innanzitutto, se è presente un responsabile della sicurezza, , il suo metodo checkLink viene chiamato con il nome della libname come argomento. Ciò può causare in un'eccezione di sicurezza.

Procedimento System.loadLibrary (String) è convenzionali e conveniente mezzo di invocare questo metodo. Se metodi nativi devono essere utilizzati nella implementazione di una classe, di una strategia standard è quello di mettere il codice nativo in un file di libreria (chiamarlo libfile) e poi di mettere un inizializzatore statico:

static { System.loadLibrary("LibFile"); } 

all'interno della dichiarazione di classe. Quando la classe viene caricata e inizializzata, l'implementazione di codice nativo necessaria per i metodi nativi sarà quindi caricata.

Se questo metodo viene chiamato più di una volta con lo stesso nome della libreria, i chiamate seconda e successive sono ignorati.

+0

Sì, hai capito :) –

+1

È vero anche per System.load? I documenti non specificano in alcun modo. –

+0

Sì. Questo vale anche per System.load. –

0

Sono abbastanza sicuro che tutte le chiamate successive per caricare una libreria già caricato non hanno alcun effetto [citazione necessaria].

Questo è stato verificato nel codice sorgente della classe ClassLoader, ma sto ancora cercando di trovare una buona fonte per questo.

0

creare una classe Singleton, che carico "jni" solo durante la sua prima esemplificazione, e chiamano questo singolo nel class1 e class2 invece di System.loadLibrary ("JNI")

2

Dal JavaDocs -

Se questo metodo viene chiamato più volte con lo stesso nome di libreria, la seconda e le successive chiamate vengono ignorate.

Problemi correlati