Ich suche nach einer Möglichkeit, C-Code in einer Android NDK-Anwendung mit Eclipse einfach zu debuggen. Ich habe Möglichkeiten zum Debuggen der App mit gdb oder ähnlichem gelesen, aber ich möchte eine Möglichkeit, Nachrichten irgendwie an Eclipse zu senden.
Ich suche nach einer Lösung, die so einfach ist wie die Verwendung einer Druckfunktion in C und die Anzeige im DDMS-Protokoll oder ähnlichem. Hat jemand Erfahrung damit?
Bisher hat noch niemand Informationen zu verschiedenen Protokollstufen veröffentlicht. Die Antwort ist ein Versuch, das Protokollierungsbild voll zu machen .
#include <android/log.h> #define TAG "MY_TAG" #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__) #define LOGW(...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__) #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__) #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
Verwendung:
char err[] = "wrong"; LOGE("Something went %s", err);
Verknüpfen Sie die Android- Protokollbibliothek wie folgt.
Android.mk :
CMakeLists.txt :
find_library( log-lib log ) target_link_libraries( ${log-lib} )
Weiterführende Literatur: Protokollierung
quelle
Am einfachsten ist es wahrscheinlich, printf () -Anweisungen in das Systemprotokoll umzuleiten (basierend auf dem Abschnitt "Anzeigen von stdout und stderr" des offiziellen ADB-Referenzhandbuchs) .
Geben Sie diese 3 Befehle in eine Befehlszeile ein:
adb shell stop adb shell setprop log.redirect-stdio true adb shell start
Anschließend können Sie die Ausgabe Ihrer "printf ()" - Anweisungen anzeigen, indem Sie das Fenster "LogCat" des Eclipse-Debuggers aufrufen oder dies in eine Befehlszeile eingeben:
Beachten Sie jedoch, dass Sie den Standardpuffer unbedingt leeren sollten, da die Daten vor der Übertragung vom Emulator oder Gerät gepuffert werden, z.
printf("Hello, I am %d years old!\n", 30); fflush(stdout);
Sie sollten dann eine Protokollmeldung sehen, die mit "I / stdout:" beginnt.
quelle
fflush
muss nach jeder printf-Anweisung aufgerufen werden?Eine alternative Lösung (unter Verwendung eines Debuggers) wird hier erklärt:
Wie kann ich C-Code, der mit JNI in Eclipse eingeschlossen ist, effektiv debuggen? (Android Dev)
quelle
ADT 20 enthält ein NDK-Plugin, das das Erstellen und Debuggen von NDK-Projekten in Eclipse unterstützt. Dieses Dokument beschreibt die Installation und Verwendung des NDK-Plugins. Die Anweisungen sind ziemlich einfach und bestehen aus nur wenigen Schritten.
Dies ist die einfachste Lösung, die ich gefunden habe und die bei mir funktioniert hat.
Hinweis: Wenn Sie das ADT-Bundle verwenden, müssen Sie nur die C-Entwicklungstools mit der Installation neuer Software installieren (siehe Screenshot), und Sie können sofort zum Teil "Verwenden des NDK-Plugins" wechseln.
Bearbeiten: Es scheint ein Problem mit CDT in Eclipse Juno http://code.google.com/p/android/issues/detail?id=33788 zu geben, das dazu führt, dass der Debugger von Eclipse keine Haltepunkte finden kann. Die Problemumgehung, die ich verwendet habe, besteht darin, die App im Debug-Modus zu starten (nicht als native App zu debuggen, sondern als "normales" Debug) und dann in der Befehlszeile zu meinem Projektstamm zu gehen und einzugeben
ndk-gdb
(dies erstellt einegdb.setup
Datei imobj/local/armeabi
Ordner). Danach funktionierten die Haltepunkte wie gewohnt.In Kommentaren zum Problem über den obigen Link schlagen sie einige andere Problemumgehungen vor, aber ich habe sie nicht ausprobiert, da sie anscheinend mehr Aufwand erfordern.
quelle
Sie können auch ein wenig nutzen
#include <android/log.h> #define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "native-lib", __VA_ARGS__))
Verwendung:
std::string hello = "Hello from C++"; int a = 1; LOGI("int %d, string: %s", a, hello.c_str());
quelle
Für alle, die Probleme haben
funktioniert nicht, fügen Sie es einfach nach jedem hinzu
Ich weiß nicht warum, aber es hat bei mir funktioniert.
Prost!
quelle