2011-01-07 14 views
55

Szukam sposobu na łatwe debugowanie kodu C w aplikacji Android NDK przy użyciu Eclipse. Czytałem sposoby debugowania aplikacji za pomocą gdb lub czegoś podobnego, ale to, czego chcę, jest sposobem na przekazywanie wiadomości do Eclipse.Każdy prosty lub łatwy sposób debugowania kodu NDK Androida?

Szukam rozwiązania, które jest tak proste, jak korzystanie z funkcji drukowania w C i widzenie jej w dzienniku DDMS lub podobnym. Czy ktokolwiek ma takie doświadczenie?

Odpowiedz

105

Można użyć Android urządzeń rejestrowania:

#include <android/log.h> 

#define APPNAME "MyApp" 

__android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "The value of 1 + 1 is %d", 1+1); 

Upewnij się również link przeciwko biblioteki rejestrowania, w Android.mk pliku:

LOCAL_LDLIBS := -llog 
+0

hmm ... nie można jeszcze tak działać. Kompiluje się dobrze, a mój testowy kod działa, ale nic w dzienniku. Będziemy dalej z nim grać. Dzięki za sugestię – wajiw

+0

Dobra, mam to działa przy użyciu twojego kodu. Musiałem poprosić jni o przeładowanie biblioteki. Nie wiem, dlaczego to było buforowanie. Dzięki jeszcze raz! – wajiw

+0

Naprawdę jestem zdezorientowany powyższym komentarzem .... Czy ktoś usunął obraźliwy komentarz czy coś takiego? (Niezależnie, dzięki za odpowiedź, svdree) – codetaku

12

Wiadomość e najbardziej prawdopodobnym sposobem jest przekierowanie instrukcji printf() do logu systemowego (w oparciu o sekcję "Wyświetlanie stdout i stderr" z the official ADB reference manual.

Rodzaj te 3 komendy w wierszu poleceń:

adb shell stop 
adb shell setprop log.redirect-stdio true 
adb shell start 

Następnie można zobaczyć wyjście swojego „printf()” wypowiedzi patrząc na oknie „logcat” Eclipse Debugger, lub wpisując to w wierszu poleceń:

adb logcat 

Wystarczy mieć świadomość, że skoro dane są buforowane przed przeniesieniem z emulatora lub urządzenia, powinno się opróżnić bufor stdout, np

printf("Hello, I am %d years old!\n", 30); 
fflush(stdout); 

Należy wtedy wyświetlony komunikat dziennika zaczynające się od „I/stdout:”

+4

Należy zauważyć, że to rozwiązanie powoduje przerwanie testów JUnit. Zobacz: http://stackoverflow.com/questions/3462850/trying-to-run-trivial-android-junit-tests-getting-test-run-failed-no-test-re –

+0

Czy te polecenia powinny być wykonywane przed każdym uruchomieniem , czy tylko raz? –

+0

'fflush' musi być wywołany po każdym poleceniu printf? –

2

ADT 20 zawiera wtyczki NDK, który zapewnia wsparcie dla tworzenia i debugowania projektów NDK w Eclipse. This document opisuje, jak zainstalować i korzystać z wtyczki NDK. Instrukcje są dość proste i składają się z zaledwie kilku kroków.

To jest najprostsze rozwiązanie, które znalazłem i zadziałało.

Uwaga: Jeśli korzystasz z pakietu ADT, wystarczy zainstalować narzędzia programistyczne C z instalacją nowego oprogramowania (patrz zrzut ekranu) i możesz natychmiast przejść do sekcji "Korzystanie z wtyczki NDK".

c dev tools install

Edit: Wydaje się, że jest problem z CDT Eclipse Juno http://code.google.com/p/android/issues/detail?id=33788 powodując debugger Eclipse, aby być w stanie znaleźć punkty przerwania. Obejście, którego używałem, to uruchomić aplikację w trybie debugowania (nie debugować jako aplikacja natywna, ale "regularne" debugowanie), a następnie w wierszu poleceń przeszedłem do katalogu głównego projektu i wpisałem ndk-gdb (tworzy to plik gdb.setup w folderze obj/local/armeabi). Po tym breakpoincie działały jak zwykle.

W komentarzach dotyczących problemu na powyższym linku sugerują inne obejścia, ale nie wypróbowałem ich, ponieważ wydawało się, że wymagają więcej wysiłku.

Powiązane problemy