¿Alguna forma simple o fácil de depurar el código NDK de Android?


Estoy buscando una manera de depurar fácilmente el código C en una aplicación NDK de Android usando Eclipse. He leído formas de depurar la aplicación usando gdb o algo similar, pero lo que quiero es una forma de enviar mensajes a Eclipse de alguna manera.

Estoy buscando una solución que sea tan simple como usar una función de impresión en C y verla en el registro DDMS o algo similar. ¿Alguien tiene experiencia haciendo esto?

Author: wajiw, 2011-01-07

4 answers

Puede utilizar las instalaciones de registro de Android:

#include <android/log.h>

#define APPNAME "MyApp"

__android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "The value of 1 + 1 is %d", 1+1);

Asegúrese también de enlazar con la biblioteca de registro, en su Android.mk archivo:

  LOCAL_LDLIBS := -llog
 111
Author: svdree,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-07 20:03:01

La forma más fácil es probablemente redirigir las sentencias printf() al registro del sistema (basado en la sección "Viendo stdout y stderr" de el manual de referencia oficial de ADB.

Escriba estos 3 comandos en una línea de comandos:

adb shell stop
adb shell setprop log.redirect-stdio true
adb shell start

Luego puede ver la salida de sus declaraciones" printf () "mirando la ventana "LogCat" del Depurador Eclipse, o escribiendo esto en una línea de comandos:

adb logcat

Solo tenga en cuenta que ya que los datos se almacenan en búfer antes de transferir desde el emulador o dispositivo, definitivamente debe limpiar el búfer stdout, por ejemplo:

printf("Hello, I am %d years old!\n", 30);
fflush(stdout);

Entonces debería ver un mensaje de registro que comienza con "I / stdout:"

 12
Author: Shervin Emami,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-11 08:28:22

Una solución alternativa (usando un depurador) se explica aquí:

¿Cómo puedo depurar eficazmente el código C que está envuelto con JNI en Eclipse? (Android Dev)

 2
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:26

ADT 20 incluye un complemento NDK que proporciona soporte para la creación y depuración de proyectos NDK en Eclipse. Este documento describe cómo instalar y usar el plugin NDK. Las instrucciones son bastante sencillas y consisten en solo unos pocos pasos.

Esta es la solución más simple que encontré y funcionó para mí.

Nota: Si está utilizando ADT bundle, solo necesita instalar C development tools con instalar nuevo software (vea la captura de pantalla) y puede ir a " Usar el NDK plugin " parte inmediatamente.

instalación de c dev tools

Editar: Parece que hay un problema con CDT en eclipse juno http://code.google.com/p/android/issues/detail?id=33788 causando que el depurador de eclipse no pueda encontrar puntos de interrupción. La solución que utilicé es iniciar la aplicación en modo de depuración (no como aplicación nativa, sino como depuración 'regular') y luego en la línea de comandos fui a la raíz de mi proyecto y escribí ndk-gdb (esto crea gdb.setup archivo en la carpeta obj/local/armeabi). Después de que los puntos de interrupción trabajaron como habitual.

En los comentarios relacionados con el problema en el enlace anterior, sugieren algunas otras soluciones, pero no las probé ya que parecían requerir más esfuerzo que esto.

 2
Author: draganstankovic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-07 11:00:30