2010-07-13 11 views
7

Sto trasferendo su Android un'applicazione C complessa, come una libreria SO, avvolta con un sottile strato java. Dopo poche ore di problemi, ho il codice in fase di compilazione sotto Android, ma, naturalmente, l'applicazione si blocca :(Debug di Android NDK, sotto windows

Dopo aver guardato in giro, ho capito che l'unico modo per eseguire il debug di un'applicazione C su Android è tramite gdb. Hai un sacco di esperienza con gdb, nessuno là fuori può condividere alcune intuizioni?

Chiunque ha un tutorial per gdb in windows :)?

thx

+0

bello, ma non riesco ad accedervi: ( – Noam

+0

@ognian il tuo account con il link è sospeso ... lol Vorrei conoscere anche la risposta a questa domanda mentre seguivo il link di asnwers e ho scoperto che neanche la soluzione funzionava. – JPM

risposta

8

per una versione più recente di NDK (sto usando R7C), è possibile costruire versione di debug da

  1. aggiungere android:debuggable="true" bandiera per <Application> tag nel AndroidManifest.xml
  2. invocare ndk-build con NDK_DEBUG=1 (Flag NDK_DEBUG non necessario se si esegue ndk-build con shell unix)

su Windows, le cose diventano un po 'complicate perché per usare ndk-gdb, hai ancora bisogno di bash (o cygwin) a partire da NDK r7c, tuttavia ndk-build in esecuzione in cygwin bash si imbatterà in problemi di autorizzazione se usi mai una delle librerie statiche precostruite

mia soluzione sulla macchina Windows è

  1. aggiungere android:debuggable="true" bandiera per <application tag AndroidManifest.xml (come sopra)
  2. cmd (prompt dei comandi di Windows): invocare ndk-build con NDK_DEBUG=1
  3. in bash cygwin: run ndk-gdb

per una rapida indagine iniziale di così libreria nativa, creare una semplice attività con un pulsante per attivare la funzione di libreria e loadLibrary nell'attività come:

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

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

    public native void libfunc(); 

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

Così, quando gdb inizia, la libreria in questione è effettivamente caricata, ma è ancora possibile avere il tempo di impostare i punti di interruzione, ecc. Prima che il programma si blocchi; al termine dell'impostazione del debugger, al prompt , digitare (o semplicemente 'c'), quindi premere il pulsante per avviare il programma in arresto e debugging felice ...