Java Language Chargement de bibliothèques natives


Exemple

L'idiome commun pour charger des fichiers de bibliothèque partagée en Java est le suivant:

public class ClassWithNativeMethods {
    static {
        System.loadLibrary("Example");
    }

    public native void someNativeMethod(String arg);
    ...

Les appels à System.loadLibrary sont presque toujours statiques pour se produire lors du chargement de la classe, garantissant qu'aucune méthode native ne peut s'exécuter avant le chargement de la bibliothèque partagée. Cependant, ce qui suit est possible:

public class ClassWithNativeMethods {
    // Call this before using any native method
    public static void prepareNativeMethods() {
        System.loadLibrary("Example");
    }

    ...

Cela permet de différer le chargement de la bibliothèque partagée jusqu'à ce que cela soit nécessaire, mais nécessite un soin particulier pour éviter java.lang.UnsatisfiedLinkError s.

Recherche de fichier cible

Les fichiers de bibliothèque partagés sont recherchés dans les chemins définis par la propriété système java.library.path , qui peuvent être -Djava.library.path= l'aide de l'argument -Djava.library.path= JVM au moment de l'exécution:

java -Djava.library.path=path/to/lib/:path/to/other/lib MainClassWithNativeMethods

Attention aux séparateurs de chemin système: par exemple, Windows utilise ; au lieu de :

Notez que System.loadLibrary résout les noms de fichiers de bibliothèque en fonction de la plate-forme: l'extrait de code ci-dessus attend un fichier nommé libExample.so sous Linux et Example.dll sous Windows.

Une alternative à System.loadLibrary est System.load(String) , qui prend le chemin d'accès complet à un fichier de bibliothèque partagée, contournant la recherche java.library.path :

public class ClassWithNativeMethods {
    static {
        System.load("/path/to/lib/libExample.so");
    }

    ...