2010-07-13 7 views
7

Estoy portando una aplicación C compleja a Android, como una biblioteca SO, envuelta con capa delgada de Java. Después de algunas horas de problemas, tengo el código compilado bajo Android, pero por supuesto, la aplicación falla :(Depuración de Android NDK, en windows

Después de mirar a mi alrededor, entiendo que la única manera de depurar la aplicación C en Android es por gdb. no tiene mucha experiencia con gdb, cualquiera puede compartir algunas ideas?

Cualquiera tiene un tutorial para gdb en windows :)?

THX

+0

nice, pero no puedo acceder a él: ( – Noam

+0

@ognian su cuenta con el enlace está suspendida ... lol Me gustaría saber la respuesta a esta pregunta también, ya que seguí el enlace asnwers y descubrí que la solución tampoco funcionaba. – JPM

Respuesta

8

por una versión más reciente de NDK (estoy usando R7C), se puede construir la versión de depuración

  1. añadir android:debuggable="true" bandera para <Application> etiqueta en AndroidManifest.xml
  2. invocar ndk-build con NDK_DEBUG=1 (El indicador NDK_DEBUG no es necesario si se está ejecutando ndk-build con un shell de Unix)

en Windows, las cosas se vuelven un poco complicadas porque para usar ndk-gdb, todavía necesita bash (o cygwin) desde NDK r7c, pero ndk-build ejecutándose en cygwin bash se encontrará con un problema de permiso si alguna vez usa alguna biblioteca estática preconstruida

mi solución en la máquina de las ventanas es

  1. añadir android:debuggable="true" bandera para <application etiqueta en AndroidManifest.xml (igual al anterior)
  2. cmd (símbolo del sistema de Windows'): ndk-build invocan con NDK_DEBUG=1
  3. en bash Cygwin: plazo ndk-gdb

para la investigación inicial rápida de los nativos de modo biblioteca, crear una actividad sencilla con un botón para activar la función de entrada de la biblioteca y loadLibrary en la actividad como:

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

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

    public native void libfunc(); 

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

Así que cuando gdb inicia, la biblioteca en cuestión está realmente cargada, pero aún puede tener tiempo para establecer puntos de interrupción, etc. antes de que el programa falle; cuando termine de configurar el depurador, en el (gdb) mensaje, escriba continue (o simplemente 'c'), luego presione el botón para iniciar el programa bloqueado y depuración feliz ...