web-dev-qa-db-fra.com

Consigner les valeurs des variables dans Android ndk natif

J'ai configuré la journalisation avec C++ dans Android NDK.

Je peux imprimer un message pour logcat comme ceci:

__Android_log_write(Android_LOG_INFO, "tag here", "message here");

Supposons maintenant que j'ai un entier appelé testint. Comment imprimer la valeur de cet entier?

Quelque chose comme ça imprime l'adresse, mais je veux la valeur. Je n'ai rien trouvé dans C++ sur la façon de procéder. Merci pour toute aide!

__Android_log_print(Android_LOG_INFO, "sometag", "%p", *test);
48
dorien

Vous pouvez utiliser __Android_log_print qui utilise une syntaxe semblable à sprintf qui formate vos données en une chaîne.

__Android_log_print(Android_LOG_INFO, "sometag", "test int = %d", testInt);
45
Benoit Duffez

Voici la manière la plus concise que j'ai vue:

#include <Android/log.h>

#define  LOG_TAG    "someTag"

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

...

// Now you can log very simply like this:
int foo = 42;
LOGD( "This is a number from JNI: %d", foo );

Assurez-vous également de créer un lien vers la bibliothèque de journaux dans votre Android.mk:

LOCAL_LDLIBS    := -llog
67
Adam

Profitez de la fonction d'impression de journaux variadic dont vous disposez. Pour mon propre code, je fournis une fonction LogInfo () pour le rendre simple. Bien sûr, plusieurs options s'offrent à vous ici.

void LogInfo(const char *sTag, const char *fmt, ...)
{
  va_list ap;
  va_start(ap, fmt);
  __Android_log_vprint(Android_LOG_INFO, sTag, fmt, ap);
  va_end(ap);
}
13
mah

__Android_log_print () prend une chaîne de format et une liste d'arguments variables. Le spécificateur de format que vous recherchez pour imprimer un entier signé est "% d". Donc, quelque chose comme ça est ce que vous voulez:

int foo = 42;
__Android_log_print(Android_LOG_INFO, "SomeTag", "foo is %d", foo);

Pour plus d'informations sur les chaînes de format, vous pouvez voir le sprintf manual .

11
kelnos