Quelles sont les conséquences si nous essayons d'attacher un fil natif en permanence à la DVM (JVM)?

Est-il possible d'attacher un fil natif en permanence à la JVM (AttachCurrentThread) (ou) est-il préférable de s'attacher lorsque vous avez besoin (appeler des fonctions java) et de le détacher une fois que le travail est terminé

J'ai écrit un échantillon d'application natif avec les cas ci-dessus, n'a trouvé aucune différence. Mais en effectuant un googling, j'ai vaguement constaté que, lorsqu'il était attaché à JVM, la planification des threads JVM est responsable de la planification, sinon le système d'exploitation programmera le thread natif (s'il n'est pas attaché). Est-ce vrai?

  • Est-il possible d'avoir plus d'un fichier de ressources de chaîne dans Android?
  • Comment obtenez-vous le numéro de page actuel d'un ViewPager pour Android?
  • Comment utiliser People.getFraction ()?
  • Obtenir la valeur d'un champ de texte d'édition
  • Comment puis-je développer des applications mobiles à l'aide de HTML5?
  • Implémenter plusieurs fragments dans une seule activité dynamiquement
  • Il est important de détacher tout thread précédemment attaché; Sinon, le programme ne quittera pas lorsque vous appelez DestroyJavaVM. – http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jniref.html#attach

    Y aura-t-il des problèmes de performance?
    S'il vous plaît, faites-moi savoir si quelqu'un sait, c'est l'aspect mon aspect important.

    Merci et salutations.

  • Vue non attachée au gestionnaire de fenêtres, dialogue rejeté
  • Notification spécifique d'usure Android
  • Quelle est la ligne de base de RelativeLayout?
  • Comment obtenir le numéro de version / version de votre application Android?
  • Quelle est la meilleure pratique pour partager des cours entre une application Wear et Android?
  • Comment afficher le clavier Android avec le mode symboles par défaut?
  • 3 Solutions collect form web for “Quelles sont les conséquences si nous essayons d'attacher un fil natif en permanence à la DVM (JVM)?”

    D'une manière générale, le coût de performance principal est la création de threads au niveau du système d'exploitation. Soit le thread crée en natif, puis est attaché ou créé directement comme java.lang.Thread partir de l'API Java.

    Si vous réutilisez le même thread natif, les performances seront bonnes. Soit dit en passant, ne créez pas des dizaines de threads natifs.

    La JVM ne planifie pas les threads lui-même . Il peut les forcer en état de sommeil pour diverses raisons, comme la collecte des ordures. Dans ce cas particulier, il faut attendre un appel JNI d'un fil natif avant de collecter. Vous devez donc éviter une exécution de code trop longue sans appel JNI pour réduire la consommation de VM VM.

    De plus, vous devez prendre soin d'appeler DeleteLocalRef avant de détacher un thread natif, sinon votre VM perdra la mémoire.

    Lorsqu'un fil natif est attaché en permanence, ne peut pas quitter le thread natif. Il s'écrase lorsque nous essayons de quitter le fil natif sans se détacher. Mais lorsque nous nous sommes détachés, le thread natif a pu faire une sortie gracieuse.

    Je n'ai connu aucune conséquence, sauf pour des performances améliorées.

    C'est exactement ce que je fais dans une application qui ByteBuffer directement les données ByteBuffer entre les deux couches. J'ai découvert que le coût de l'attachement / détachement constamment était très élevé, comme on pouvait s'y attendre. Mon approche consiste à lancer un seul thread géré par Java qui déclenche un appel JNI de blocage au démarrage, qui dans la couche C / C ++ contient une boucle de type condition / signal (pour ne pas consommer de cycles CPU). Je peux alors signaler à la boucle si les données sont prêtes à être traitées et, à l'inverse, je peux signaler à Java lorsque le travail est dur.

     new Thread(() -> myBlockingJNICall()).start(); 

    Puis vers le bas dans la couche C:

     #ifdef __cplusplus extern "C" { #endif // __cplusplus static JavaVM *jvm = nullptr; // captures the JVM on load JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *the_jvm, void* /*reserved*/) { jvm = the_jvm; return JNI_VERSION_1_2; // must export 1_2 to use any of the new functions, 1_1 otherwise } JNIEXPORT jboolean JNICALL Java_myBlockingJNICall(JNIEnv *env, jobject) { // loop forever waiting for work and using env for signalling // jvm is stored in case we need to manually attach (or perform more complex work requiring jvm access) return JNI_TRUE; } #ifdef __cplusplus } #endif // __cplusplus 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.