2010-07-13 13 views
7

Je suis en train de porter une application C complexe sur Android, sous la forme d'une bibliothèque SO, entourée d'une fine couche Java. Après quelques heures de tracas, j'ai le code compiler sous Android, mais bien sûr, l'application plante :(Débogage d'Android NDK, sous windows

Après avoir regardé autour, je comprends que la seule façon de déboguer l'application C sous Android est par gdb. N'ont pas beaucoup d'expérience avec gdb, n'importe qui peut partager quelques idées?

Quelqu'un at-il un tutoriel pour gdb sous windows :)?

thx

+0

agréable, mais je ne peux pas y accéder: ( – Noam

+0

@ognian Votre compte avec le lien est suspendu ... lol Je ne voudrais pas connaître la réponse à cette question aussi, car j'ai suivi le lien asnwers et j'ai trouvé que la solution ne fonctionnait pas non plus. – JPM

Répondre

8

pour une version plus récente de NDK (je me sers R7C), vous pouvez construire la version de débogage par

  1. ajouter android:debuggable="true" drapeau <Application> tag dans AndroidManifest.xml
  2. invoquer ndk-build avec NDK_DEBUG=1 (L'indicateur NDK_DEBUG n'est pas nécessaire si vous exécutez ndk-build avec un shell unix)

sous Windows, les choses deviennent un peu compliquées car pour utiliser ndk-gdb, vous avez toujours besoin de bash (ou cygwin) à partir de NDK r7c, pourtant ndk-build fonctionnant sous cygwin bash va rencontrer un problème d'autorisation si vous utilisez une bibliothèque statique pré-compilée

ma solution sur la machine windows est

  1. ajouter android:debuggable="true" drapeau <application balise dans AndroidManifest.xml (comme ci-dessus)
  2. cmd (commande fenêtre d'invite): INVOKE ndk-build avec NDK_DEBUG=1
  3. en bash Cygwin: run ndk-gdb

pour enquête initiale rapide native si la bibliothèque, créer une activité simple avec un bouton pour déclencher la fonction d'entrée bibliothèque et loadLibrary dans l'activité comme:

class MyActivity extends Activity { 
    static { 
     System.loadLibrary("mylibrary"); 
    } 

    /* other functions like onCreate, etc... */ 

    public native void libfunc(); 

    public void onClick(View v){ 
     libfunc(); 
    } 
} 

Ainsi, lorsque gdb commence, la bibliothèque en question est réellement chargée, mais vous pouvez toujours avoir le temps de définir des points d'arrêt, etc. avant que le programme se bloque; lorsque vous avez terminé la mise en place du débogueur, à (gdb) invite, tapez continue (ou tout simplement « c »), puis appuyez sur le bouton pour démarrer le programme de plantage et le débogage heureux ...