2012-04-23 9 views
35

si estoy definiendo dicha función en el archivo java¿Cómo obtener mensajes "printf" escritos en la aplicación NDK?

/** 
    * Adds two integers, returning their sum 
    */ 
    public native int add(int v1, int v2); 

por eso es necesario para codificar en el archivo c

JNIEXPORT jint JNICALL Java_com_marakana_NativeLib_add 
    (JNIEnv * env, jobject obj, jint value1, jint value2) { 

    printf("\n this is log messge \n"); 

     return (value1 + value2); 
} 

continuación, desde donde este printf lo imprimirá el mensaje? En logcate no lo entiendo?

¿Cómo puedo depurar cualquier aplicación NDK poniendo mensajes de registro?

+1

'printf (3)' escribirá en lo que sea _producción estándar_ - que puede existir o no en su entorno. Mejor sería encontrar un mecanismo de registro compatible. – sarnold

Respuesta

83

use __android_log_print() en su lugar. Debe incluir el encabezado <android/log.h>

Ejemplo de muestra. __android_log_print(ANDROID_LOG_DEBUG, "LOG_TAG", "\n this is log messge \n");

También se puede utilizar como especificador de formato printf -

__android_log_print(ANDROID_LOG_DEBUG, "LOG_TAG", "Need to print : %d %s",int_var, str_var); 

Asegúrese de que también enlaza con la librería de registro, en su archivo Android.mk:

LOCAL_LDLIBS := -llog 

Ohh .. olvidó. La salida se mostrará en Logcat con la etiqueta LOG_TAG

Enfoque fácil

Agregue las siguientes líneas a su archivo de encabezado común.

#include <android/log.h> 

#define LOG_TAG "your-log-tag" 

#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) 
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) 
// If you want you can add other log definition for info, warning etc 

Ahora acaba de llamar LOGD("Hello world") or LOGE("Number = %d", any_int) como printf in c.

No olvide incluir el archivo de encabezado común.

Retire la tala

Si define LOGD(...) vacío, habrán desaparecido todos los registros. Solo comente después de LOGD(...).

#define LOGD(...) // __android_log..... rest of the code

+0

¿Cómo elimino el registro? – powder366

+1

@ powder366 respuesta actualizada. compruebe la sección de eliminación de registro. – Shaiful

+5

Solo en caso de que alguien (por ejemplo, yo) utilice Android Studio (la mina actual es 0.8.11), pones ldLibs "log" dentro de la etiqueta 'ndk'. Esto resuelve la referencia indefinida al problema '__android_log_print'. – Yang

12

Hay dos opciones:

1) reemplazar printf con __android_log_print. Puede hacer esto fácilmente con definir al principio del código:

#define printf(...) __android_log_print(ANDROID_LOG_DEBUG, "TAG", __VA_ARGS__); 

Por supuesto, esto requerirá cambiar todo el código fuente que tiene printf.

2) redirigir stdout y stderr a Logcat Android (no sé si esto va a funcionar en el dispositivo no arraigada): http://developer.android.com/guide/developing/debugging/debugging-log.html#viewingStd

+0

cuando uso la opción 2 y luego de aplicar ese 3 comando cuando ejecuto mi emulador de aplicación solo cuelgo mostrando la animación de arranque de Android ... –

5

no necesita dispositivo raíz, acroding a http://developer.android.com/guide/developing/debugging/debugging-log.html#viewingStd, a continuación se puede trabajar prefectamenta.

$ adb shell 

$ su 

$ stop 

$ setprop log.redirect-stdio true 

$ start 

done!

+2

su comando no funcionará sin acceso de root ... !! –

+0

de todos modos +1 para señalar el método setprop para esto. –

+2

Este método solo funciona en las versiones de Android que ejecutan dalvik (4.4 o anterior), las versiones de ART (5.0 o posterior) no son compatibles con log.redirect-stdio. Fuente: https://code.google.com/p/android/issues/detail?id=165602 – Deemoe

Cuestiones relacionadas