web-dev-qa-db-fra.com

Une façon simple de se connecter Android Code NDK?

Je cherche un moyen de déboguer facilement le code C dans une Android NDK utilisant Eclipse. J'ai lu des façons de déboguer l'application en utilisant gdb ou quelque chose de similaire, mais ce que je veux, c'est un moyen envoyer des messages à Eclipse d'une manière ou d'une autre.

Je cherche une solution aussi simple que d'utiliser une fonction d'impression en C et de la voir dans le journal DDMS ou quelque chose de similaire. Quelqu'un at-il une expérience dans ce domaine?

65
wajiw

Vous pouvez utiliser les fonctionnalités de journalisation Android:

#include <Android/log.h>

#define APPNAME "MyApp"

__Android_log_print(Android_LOG_VERBOSE, APPNAME, "The value of 1 + 1 is %d", 1+1);

Assurez-vous également de créer un lien avec la bibliothèque de journalisation, dans votre fichier Android.mk:

  LOCAL_LDLIBS := -llog
117
svdree

Le moyen le plus simple est probablement de rediriger les instructions printf () vers le journal système (basé sur la section "Affichage de stdout et stderr" de le manuel de référence officiel de la BAD .

Tapez ces 3 commandes sur une ligne de commande:

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

Ensuite, vous pouvez afficher la sortie de vos instructions "printf ()" en regardant la fenêtre "LogCat" du débogueur Eclipse, ou en tapant ceci sur une ligne de commande:

adb logcat

Sachez simplement que puisque les données sont tamponnées avant le transfert depuis l'émulateur ou le périphérique, vous devez absolument vider le tampon stdout, par exemple:

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

Vous devriez alors voir un message de journal commençant par "I/stdout:"

12
Shervin Emami

Personne n'a encore publié d'informations sur les différents niveaux de journalisation. La réponse est une tentative de rendre "l'image" de journalisation pleine.

#include <Android/log.h>

#define TAG "MY_TAG"

#define LOGE(...) __Android_log_print(Android_LOG_ERROR,    TAG, __VA_ARGS__)
#define LOGW(...) __Android_log_print(Android_LOG_WARN,     TAG, __VA_ARGS__)
#define LOGI(...) __Android_log_print(Android_LOG_INFO,     TAG, __VA_ARGS__)
#define LOGD(...) __Android_log_print(Android_LOG_DEBUG,    TAG, __VA_ARGS__)

Usage:

char err[] = "wrong";
LOGE("Something went %s", err);

Lien Android bibliothèque de journaux comme ci-dessous.

Android.mk :

LOCAL_LDLIBS := -llog

CMakeLists.txt :

find_library( log-lib log )
target_link_libraries( ${log-lib} )

Lectures complémentaires: Logging

6
Onik

Vous pouvez également un petit util

#include <Android/log.h>

#define LOGI(...) ((void)__Android_log_print(Android_LOG_INFO, "native-lib", __VA_ARGS__))

Usage:

std::string hello = "Hello from C++";
int a = 1;
LOGI("int %d, string: %s", a, hello.c_str());
2
Geng Jiawen

ADT 20 inclut un plugin NDK qui prend en charge la création et le débogage de projets NDK dans Eclipse. Ce document décrit comment installer et utiliser le plugin NDK. Les instructions sont assez simples et ne comportent que quelques étapes.

C'est la solution la plus simple que j'ai trouvée et elle a fonctionné pour moi.

Remarque: Si vous utilisez le bundle ADT, il vous suffit d'installer les outils de développement C avec l'installation d'un nouveau logiciel (voir la capture d'écran) et vous pouvez accéder immédiatement à la partie "Utilisation du plugin NDK".

c dev tools install

Edit: Il semble qu'il y ait un problème avec CDT dans Eclipse juno http://code.google.com/p/Android/issues/detail? id = 33788 empêchant le débogueur d'Eclipse de trouver des points d'arrêt. La solution de contournement que j'ai utilisée consiste à démarrer l'application en mode débogage (pas à déboguer en tant qu'application native mais à déboguer "régulièrement"), puis en ligne de commande, je suis allé à la racine de mon projet et j'ai tapé ndk-gdb (cela crée gdb.setup fichier dans obj/local/armeabi dossier). Après cela, les points d'arrêt ont fonctionné comme d'habitude.

Dans les commentaires liés au problème sur le lien ci-dessus, ils suggèrent d'autres solutions de contournement, mais je ne les ai pas essayés car ils semblaient nécessiter plus d'efforts que cela.

2
draganstankovic

Une solution alternative (utilisant un débogueur) est expliquée ici:

Comment puis-je déboguer efficacement le code C qui est enveloppé avec JNI dans Eclipse? (Android Dev)

2
Chris