10
votes

Appel Java Jni pour charger la bibliothèque

Cela a-t-il une incidence sur la mémoire si j'ai deux classes Java qui ont des appels autochtones à compiler C Code et j'appelle ces deux classes dans une autre classe? Par exemple, j'ai la classe A et la classe B avec les deux appels vers des fonctions natives. Ils sont configurés comme ceci:

public class C{
    // declare the native code function - must match ndkfoo.c
    //  So is it beter to declare loadLibrary here than in each individual class?
    //static {
    //  System.loadLibrary("ndkfoo");
    //}
    //

    public C() {}

    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        double result = a.getMath() + b.getNonMath();

    }
}


0 commentaires

4 Réponses :


2
votes

Il est préférable d'avoir la classe qui utilise la bibliothèque, chargez la bibliothèque. Si vous devez charger la bibliothèque, vous permettez d'appeler les méthodes natives sans chargement de la bibliothèque.


0 commentaires

0
votes

semble être et ndkfoo code> serait prudent et que chaque méthode est originaire d'origine. Ensuite, à partir d'un, vous pouvez utiliser

NdkFoo.getInstance().nonMathMethod();


0 commentaires

2
votes

Les libs JNI sont des libs dynamiques. Je penserais qu'ils devraient être chargés de charger par LoadLibrary. L'un des avantages des bibliothèques dynamiques est que s'ils sont déjà chargés en mémoire, cette copie est utilisée au lieu d'être rechargée. Vous pouvez donc utiliser les deux appels de chargement.

L'autre problème est que si vous mettez l'appel de chargement dans la classe C, vous avez ruiné l'encapsulation des deux autres classes. Dans un grand projet, quelqu'un va éventuellement appeler l'un des appels natifs en classe A ou en classe B sans passer par classe c. Cela ne fonctionnera pas si bien.


0 commentaires

10
votes

Non, peu importe. Il est inoffensif pour appeler LoadLibrary () plus d'une fois dans le même chargeur de classe.

de la documentation pour Runtime.loadLibrary (String) , appelé par System.LoadLibrary (String): P>

   If this method is called more than once with the same library name, 
   the second and subsequent calls are ignored.


0 commentaires