2009-07-15 6 views
13

J'ai plusieurs classes qui utilisent la même bibliothèque JNI, appelée "jni". Dans chacune de ces classes, j'ai un appel System.loadLibrary() dans initialiseur statique de la classe:Empêcher Java de charger la bibliothèque plus d'une fois

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

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

Le seul problème est, je ne veux System.loadLibrary() à appeler une fois, car il peut prendre quelque temps. Existe-t-il un moyen facile et propre d'empêcher plusieurs chargements de la même bibliothèque?

Répondre

30

Si la bibliothèque a déjà été chargée, tous les appels suivants pour charger la même bibliothèque seront ignorés.

System.loadLibrary:

charge la bibliothèque de système spécifié par l'argument libname. La manière dont est mappé à la bibliothèque système réelle est dépendante du système .

Le System.loadLibrary d'appel (nom) est effectivement équivalent à l'appel

Runtime.getRuntime().loadLibrary(name) 

Runtime.loadLibrary:

charge la bibliothèque dynamique avec le nom de bibliothèque spécifié . Un fichier contenant du code natif est chargé à partir de le système de fichiers local à partir d'un emplacement où les fichiers de bibliothèque sont classiquement obtenus. Les détails de ce processus dépendent de l'implémentation. Le mappage d'un nom de bibliothèque à un nom de fichier spécifique est effectué de manière spécifique au système . D'abord, s'il y a un gestionnaire de sécurité, sa méthode checkLink est appelée avec le nom de la bibliothèque comme argument. Cela peut entraîner une exception de sécurité. La méthode System.loadLibrary (String) est le moyen conventionnel et pratique d'invoquer cette méthode. Si méthodes natives doivent être utilisées dans la mise en œuvre d'une classe, une stratégie norme est de mettre le code natif dans un fichier de bibliothèque (appeler libfile) et puis de mettre un initialiseur statique:

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

dans la déclaration de classe. Lorsque la classe est chargée et initialisée, l'implémentation de code natif nécessaire pour les méthodes natives sera alors également chargée .

Si cette méthode est appelée plus une fois avec le même nom de la bibliothèque, les appels deuxième et les suivants sont ignorés .

+0

Oui, vous l'avez :) –

+1

Est-ce vrai aussi pour System.load? Les documents ne spécifient aucune façon. –

+0

Oui. Cela est également vrai pour System.load. –

0

Je suis assez sûr que tous les appels suivants pour charger une bibliothèque ont déjà chargée aucun effet [citation nécessaire].

Cela a été vérifié dans le code source de classe ClassLoader, mais j'essaie toujours de trouver une bonne source pour cela.

0

Créer une classe singleton qui charge "JNI" que pendant sa première instanciation, et appellent cela singleton dans Class1 et Class2 au lieu de System.loadLibrary ("JNI")

2

De l'JavaDocs -

Si cette méthode est appelée plusieurs fois avec le même nom de bibliothèque, les appels suivants sont ignorés.

Questions connexes