2014-04-21 3 views
2

J'ai une application android utilisant plusieurs threads (par exemple, ui thread un thread de mise en réseau). Maintenant, je veux que les deux threads appellent des fonctions natives. Certaines fonctions natives appellent également des fonctions Java.Environnement de cache JNI dans une application multithread

Pour cela, un JNIEnv* est nécessaire, ce qui diffère d'un fil à l'autre. Mais je suppose que l'appel GetEnv() est assez inefficace.

Y at-il un moyen de mettre en cache le JNIEnv* s pour chaque thread, puis de déterminer, dans quel thread nous sommes (dans la fonction native) pour utiliser le bon JNIEnv* en cache?

Répondre

0

Vous ne pouvez pas mettre en cache le JNIEnv et utiliser AttachCurrentThread() sur la machine virtuelle Java mise en cache *. Si le thread natif est déjà attaché, je crois que cette fonction est équivalente à un NOOP.

if ((*jvm)->AttachCurrentThread(jvm, (void **)(&env), NULL) == JNI_OK) { 
    .... 
} 
+0

Merci! Que diriez-vous de la performance de 'AttachCurrentThread()'? Est-il remarquable lent? – Uroc327

+0

Si le thread est déjà attaché, c'est aussi rapide que l'instruction no-op. Donc, oui c'est aussi rapide que ça va aller. Il y a peut-être un problème de performance si vous devez vous attacher à un tas de threads nouvellement créés, cependant, je doute que JNI soit votre goulot d'étranglement à ce moment-là. –

+0

Bon à savoir! Je vous remercie! – Uroc327

Questions connexes