Java JNI appel à charger la bibliothèque
T-il de l'impact de la mémoire si j'ai deux classes Java natif appels compilé en code C, et j'appelle ces deux classes dans une autre classe? Par exemple, j'ai la Classe A et de Classe B avec deux appels à des fonctions natives. Ils sont configurés comme ceci:
public class A{
//declare the native code function - must match ndkfoo.c
static {
System.loadLibrary("ndkfoo");
}
private static native double mathMethod();
public A() {}
public double getMath() {
double dResult = 0;
dResult = mathMethod();
return dResult;
}
}
public class B{
//declare the native code function - must match ndkfoo.c
static {
System.loadLibrary("ndkfoo");
}
private static native double nonMathMethod();
public B() {}
public double getNonMath() {
double dResult = 0;
dResult = nonMathMethod();
return dResult;
}
}
Classe C puis des appels à la fois, car ils font tous deux appel statique pour charger la bibliothèque de la matière dans la classe C? Ou est-il préférable d'avoir de la Classe C Système d'appel.loadLibrary(...?
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();
}
}
OriginalL'auteur JPM | 2011-12-08
Vous devez vous connecter pour publier un commentaire.
Non, il n'a pas d'importance. Il est inoffensif pour appeler la fonction loadLibrary() plusieurs fois dans la même classloader.
À partir de la documentation pour Moment de l'exécution.loadLibrary(String), qui est appelée par le Système.loadLibrary(String):
OriginalL'auteur Andy Thomas
De son mieux pour avoir la classe qui utilise la bibliothèque, de la charge de la bibliothèque. Si vous avez de l'appelant, de charger la bibliothèque vous faites, il est possible d'appeler des méthodes indigènes sans chargement de la librairie.
OriginalL'auteur Peter Lawrey
Jni libs dynamiques sont des libs. Je dirait qu'ils ont d'être dans l'ordre pour être chargé par la fonction loadLibrary. L'un des avantages des bibliothèques dynamiques, c'est que si ils sont déjà chargés dans la mémoire, la copie est utilisé au lieu d'être rechargé. Ainsi, vous pouvez utiliser les deux appels loadlibrary.
L'autre problème est que si vous mettez la fonction loadlibrary appel dans la classe C, vous avez ruiné l'encapsulation des deux autres classes. Dans tout projet d'envergure, quelqu'un va finir par appeler l'un des appels natifs de classe a ou de classe b sans passer par la classe c. Qui ne fonctionne pas si bien.
OriginalL'auteur dar512
Semble et
NdkFoo
classe serait prudent, et ont toutes les méthodes pour être un natif. Ensuite, à partir d'Un vous pouvez utiliseret B pourraient faire
Il a également fait de la création de la bibliothèque native nom compatible avec la sauvegarde de nom de la classe java.
OriginalL'auteur Nate