9
votes

Débogage Android NDK C / C ++ Code dans Eclipse - Les points d'arrêt ne sont pas touchés

J'ai téléchargé Bundle SDK Android pour Linux et Android NDK. ADT a été installé, j'ai installé CDT.

J'ai créé un projet Android et ajouté un support natif (JNI). Ensuite, j'ai écrit une fonction native dans le code Java qui exportateur en code C ++. Dans C ++ Code, j'ai défini cette fonction. P>

Code Java: P>

JNIEXPORT jstring JNICALL Java_com_example_test_MainActivity_get_1text_1from_1cpp(JNIEnv * env, jobject){
    return env->NewStringUTF( "hello from C++" );
}


7 commentaires

Peut-être que vous avez ran debug, qui lance le débogueur Java? Vous devez cliquer avec droit à cliquer sur le projet et choisir "Débogage comme" -> "Application native Android"


Oui, j'ai choisi "Débogou comme" -> "Application native Android". Dans "DEBUG CONFIGURATES" a été ajouté nouvelle configuration (dans "Android Native Demande") gyazo.com/567AE4FA0E8AA2363676789B7DF780be


Peut-être que votre application exécute très tôt la fonction JNI, de sorte que le débogueur n'est pas encore prêt? Du code que vous avez posté, il n'est pas clair lorsque la méthode native est appelée. Je suggérerais un bouton de votre activité qui lancera la méthode native. Ensuite, vous avez une chance d'essayer plusieurs fois.


Entre, l'avertissement d'environ 95 bibliothèques est parfaitement normal. Ce sont les bibliothèques système que vous ne voulez pas déboguer et ne pas avoir de sources pour.


La méthode native est appelée dans la méthode Oncreate (). Quels sont les boutons?


La méthode native est appelée sur Oncreate () - c'est ce que je craignais. Ajoutez un bouton à votre activité et appelez la même méthode native OnCliquez sur ce bouton - il sera plus facile d'attraper le point d'arrêt.


Merci beaucoup! Le débogueur fonctionne excellent. J'ai intérêt pourquoi le débogueur n'est-il pas prêt dans la méthode oncreate?


6 Réponses :


3
votes

Votre application exécute très tôt la fonction JNI, de sorte que le débogueur ne soit pas encore prêt. Malheureusement, cela prend un certain temps pour GDB pour établir la connexion à distance, voir http://visualgdb.com/documentation/appstartup

Au lieu de combattre les moulins à vent, ajoutez un bouton à votre activité et appelez la même méthode native onclick () de ce bouton - il sera plus facile d'attraper le point d'arrêt.

BTW, l'avertissement d'environ 95 bibliothèques est parfaitement normal. Ce sont les bibliothèques système que vous ne voulez pas déboguer et ne pas avoir de sources pour.


0 commentaires

5
votes

Vous pouvez utiliser l'outil de débogage Android DS-5 fourni par le bras comme plugin à votre éclipse. Cela fonctionne vraiment bien et fournit une assurance-emploi très bonne et facile à déboguer. De mon expérience personnelle, il est beaucoup mieux que la manière traditionnelle de déboguer l'application NDK.

Veuillez vous reporter au lien ci-dessous qui vous fournira les détails sur l'utilisation du débogueur DS-5:

https://developer.arm.com/products/software-development-tools/ds-5-development-Studio/resources/tatudials/android-native-app-Debug-Tutorial


1 commentaires

Merci pour le lien. J'ai essayé d'utiliser DS-5 mais lorsque je crée une nouvelle configuration de débogage, je ne peux pas sélectionner un périphérique à se connecter à partir de la zone déroulante Connections, il n'y a rien là-bas.



12
votes

L'astuce que j'utilise est de mettre un appel d'usleep comme la toute première ligne natale de mon code de débogage.

Cela rend votre dormir de votre fil et donne au débogueur une chance d'être prêt pour vous. P>

#include <unistd.h>

.
.
.

#ifndef NDEBUG
usleep(5000 * 1000);
#endif


0 commentaires

1
votes

envisager d'ajouter:

android.os.debug.waitfordebugger ();

Avant votre appel natif, cela fait attendre votre application jusqu'à ce que le débogueur attache, pourrait vous aider à éviter de dormir / utiliser un bouton.


0 commentaires

6
votes

Après avoir lu un lot pour déboguer sur Eclipse Ceci est ma recette:

Faites les étapes habituelles:

  • Ajouter android.os.debug.waitfordebugger (); avant de charger votre bibliothèque natale. Cela pourrait aider.
  • Ajouter app_optim: = débogage dans application.mk
  • Construire avec ndk-build ndk_debug = 1

    Alors, ce que j'ai trouvé différent:

    • Ouvrez une console et exécutez:

      ADB TIX / SYSTEM / BIN / PAIN / LINKER / obj / local / armateur

      Selon votre appareil, vous devrez peut-être écrire armée ou arméeBI-V7A . Il vous suffit de le faire une fois (j'ai remarqué que fonctionnant ndk-gdb manuellement faisait cela. Exécuter cette commande manuellement les points d'arrêt commencés à travailler)

      • Enfin, pour déboguer Utilisez le menu "Exécution -> Débogage AS -> Android Application natif"

2 commentaires

Tire aussi d'autres libs (au moins dans 4.9 Toolchain)


Quel est le / System / Bin / Linker? Où puis-je trouver ce lien? Je suis un utilisateur Windows.



0
votes

J'ai eu cette question et la seule chose qui a fonctionné pour moi était de mettre xxx

avant la chargement de la bibliothèque JNI. Cela donnait suffisamment de temps pour le débogueur pour attacher avant l'appel à system.loadlibrary a écrasé l'application. M'a aidé à localiser le problème C ++ Code.


0 commentaires