2012-08-28 13 views
42

Skonfigurowałem rejestrowanie za pomocą C++ w Android NDK.Wartości rejestrowania zmiennych w natywnym systemie Android

mogę wydrukować wiadomość do logcat tak:

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

Teraz powiedzmy mam liczbą całkowitą nazywa testint. Jak mogę wydrukować wartość tego int?

Coś jak to drukuje adres, ale chcę wartość. Nie znalazłem nic w sprawie C++, jak to zrobić. Dzięki za pomoc!

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

Odpowiedz

36

Można użyć __android_log_print który wykorzystuje sprintf -jak składni, która formatuje dane na sznurku.

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

Skorzystaj z dostępnej funkcji drukowania dziennika variadic. Dla mojego własnego kodu, zapewniam funkcję LogInfo(), aby była prosta. Oczywiście dostępnych jest tutaj kilka opcji.

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

najlepiej wdrożyć powyższe .. .nice – Houston

+1

Dzięki za to rozwiązanie @mah, ale otrzymuję następujący błąd implementujący go dokładnie tak, jak pokazano powyżej: 'A/libc (18350): Fatal signal 7 (SIGBUS) przy 0x00000000 (code = 128), wątek 18410 (WebViewCoreThre) '. Co więcej, parametry nie są poprawnie drukowane, gdy nie wskazują właściwego adresu pamięci. Czy masz jakiś pomysł na ten temat? Bardzo dziękuję – Lisarien

+1

W rzeczywistości popełniłem błąd, aby użyć '__android_log_print' zamiast' __android_log_vprint'. Z tym ostatnim wartościami są dobrze wyświetlane w konsoli, ale zawsze otrzymuję błąd powyżej po kilku sekundach i aplikacja jest zabijana. – Lisarien

11

Funkcja __android_log_print() pobiera ciąg formatu i listę zmiennych zmiennych. Specyfikat formatu, dla którego chcesz wydrukować liczbę całkowitą ze znakiem, to "% d". Więc coś w tym jest to, co chcesz:

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

Więcej informacji na temat formatowania ciągów, można zobaczyć sprintf manual.

+0

To powinna być dopuszczalna odpowiedź – hB0

51

Oto najbardziej zwięzły sposób widziałem:

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

Ponadto, upewnij się, że odwołuje się do biblioteki dziennika w Android.mk:

LOCAL_LDLIBS := -llog 
+0

jak mogę wydrukować ciąg C++ za pomocą tego? –

+0

w taki sam sposób wywołaj zdefiniowane makro: LOGI ("To jest ciąg"); – Teocci

Powiązane problemy