2017-02-26 1 views
0

J'ai une bibliothèque partagée NDK et je souhaite effectuer des tests sur celle-ci. J'ai actuellement utilisé googletest pour créer un exécutable natif qui lie à la bibliothèque, suivi des instructions dans le README.NDK. Un exécutable factice peut s'exécuter sur un émulateur Android. Bien.Obtention d'une instance de JNIEnv dans un exécutable Android natif

Maintenant, la chose la plus délicate est que la bibliothèque partagée appelle beaucoup de fonctions d'une instance JNIEnv, par exemple:

  • env-> NewStringUTF()
  • ...

La question est, comment un exécutable natif Android peut-il obtenir une instance de JNIEnv?

Une méthode consiste à utiliser l'API d'invocation décrite ci-dessous. http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/invocation.html

Cependant, je regardais le jni.h de NDK, et il semble désavouer les usages de cette API:

/* 
* VM initialization functions. 
* 
* Note these are the only symbols exported for JNI by the VM. 
*/ 
#if 0 /* In practice, these are not exported by the NDK so don't declare them */ 
jint JNI_GetDefaultJavaVMInitArgs(void*); 
jint JNI_CreateJavaVM(JavaVM**, JNIEnv**, void*); 
jint JNI_GetCreatedJavaVMs(JavaVM**, jsize, jsize*); 
#endif 

Toutes les suggestions sont très appréciés!

(Je suis nouveau à Android donc s'il vous plaît me corriger si je me trompe. Merci!)

Répondre

0

Cela se fait via AttachCurrentThread().

Il est inoffensif de l'appeler si le thread est déjà attaché.

+0

Merci, mais AttachCurrentThread nécessite un JavaVM. Toutefois, JNI_CreateJavaVM n'est pas autorisé car l'extrait de code ci-dessus s'affiche ... – ZillGate