2012-08-28 13 views
42

Configuré el registro con C++ en Android NDK.Valores de registro de variables en Android ndk nativo

puedo imprimir un mensaje a LogCat así:

__android_log_write(ANDROID_LOG_INFO, "tag here", "message here"); 

Ahora vamos a decir que tengo un entero llamado testint. ¿Cómo puedo imprimir el valor de este int?

Algo así imprime la dirección, pero quiero el valor. No he encontrado nada en C++ sobre cómo hacer esto. ¡Gracias por cualquier ayuda!

__android_log_print(ANDROID_LOG_INFO, "sometag", "%p", *test); 

Respuesta

36

Usted podría utilizar __android_log_print que utiliza una sintaxis sprintf -como que da formato a los datos en una cadena.

__android_log_print(ANDROID_LOG_INFO, "sometag", "test int = %d", testInt); 
11

Aproveche la función de impresión de registro variadic que tiene disponible. Para mi propio código, proporciono una función LogInfo() para hacerlo simple. Por supuesto, hay varias opciones disponibles para usted aquí.

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); 
} 
+0

mejor manera de aplicar lo anterior .. .nice – Houston

+1

Gracias por esta solución @mah pero estoy recibiendo el siguiente error al implementarlo exactamente como se muestra arriba: 'A/libc (18350): señal fatal 7 (SIGBUS) en 0x00000000 (código = 128), thread 18410 (WebViewCoreThre) '. Además, los parámetros no se imprimen correctamente mientras que no apuntan a la dirección de memoria correcta. Tienes alguna idea sobre eso ? Muchas gracias – Lisarien

+1

De hecho, tuve el error de usar '__android_log_print' en lugar de' __android_log_vprint'. Con este último, los valores se muestran bien en la consola, pero siempre obtengo el error anterior después de unos segundos y la aplicación se destruye. – Lisarien

11

__android_log_print() toma una cadena de formato y una lista de argumentos variables. El especificador de formato que está buscando para imprimir un entero con signo es "% d". Así que algo como esto es lo que quiere:

int foo = 42; 
__android_log_print(ANDROID_LOG_INFO, "SomeTag", "foo is %d", foo); 

Para obtener más información sobre las cadenas de formato, se puede ver el sprintf manual.

+0

Esto debería ser aceptable, responde – hB0

51

Aquí es la forma más concisa que he visto:

#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); 

Además, asegúrese de que enlace a la biblioteca de registro en su Android.mk:

LOCAL_LDLIBS := -llog 
+0

¿cómo puedo imprimir cadenas de C++ usando esto? –

+0

de la misma manera simplemente llame a la macro definida: LOGI ("Esto es una cadena"); – Teocci

Cuestiones relacionadas