2012-08-28 1 views
42

Ho impostato la registrazione con C++ in NDK Android.Registrazione dei valori delle variabili in Android nativo ndk

posso stampare un messaggio a Logcat in questo modo:

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

Ora diciamo che ho un intero chiamato testint. Come posso stampare il valore di questo int?

Qualcosa come questo stampa l'indirizzo, ma voglio il valore. Non ho trovato nulla in C++ su come farlo. Grazie per qualsiasi aiuto!

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

risposta

36

Si potrebbe utilizzare __android_log_print che utilizza una sintassi sprintf -come che formatta i dati in una stringa.

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

Sfrutta la funzione di stampa del registro variadico disponibile. Per il mio codice personale, fornisco una funzione LogInfo() per renderla semplice. Naturalmente ci sono diverse opzioni disponibili per te qui.

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

migliore per attuare le sopra .. .nice – Houston

+1

Grazie per questa soluzione @mah ma sto ricevendo il seguente errore implementandolo esattamente come mostrato sopra: 'A/libc (18350): Segnale fatale 7 (SIGBUS) a 0x00000000 (codice = 128), thread 18410 (WebViewCoreThre) '. Inoltre, i parametri non vengono stampati correttamente mentre non puntano al giusto indirizzo di memoria. Hai qualche idea al riguardo? Grazie mille – Lisarien

+1

In effetti, ho avuto l'errore di usare '__android_log_print' invece di' __android_log_vprint'. Con quest'ultimo, i valori sono ben visualizzati nella console, ma ottengo sempre l'errore sopra dopo alcuni secondi e l'app viene uccisa. – Lisarien

11

__android_log_print() accetta una stringa di formato e un elenco di argomenti variabili. Lo specificatore di formato che stai cercando di stampare un intero con segno è "% d". Quindi, qualcosa come questo è ciò che si vuole:

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

Per ulteriori informazioni sulle stringhe di formato, si può vedere il sprintf manual.

+0

Questa risposta dovrebbe essere accettabile – hB0

51

Ecco il modo più conciso che ho 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); 

Inoltre, assicurarsi che si collega alla biblioteca di registro nella tua Android.mk:

LOCAL_LDLIBS := -llog 
+0

come posso stampare la stringa C++ usando questo? –

+0

allo stesso modo basta chiamare la macro definita: LOGI ("Questa è una stringa"); – Teocci