Gibt es eine einfache Möglichkeit, sich im Android NDK-Code anzumelden?

75

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?

wajiw
quelle

Antworten:

136

Sie können die Android-Protokollierungsfunktionen verwenden:

#include <android/log.h>

#define APPNAME "MyApp"

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

Stellen Sie sicher, dass Sie in Ihrer Android.mk-Datei auch einen Link zur Protokollierungsbibliothek erstellen:

  LOCAL_LDLIBS := -llog
svdree
quelle
1
Wenn Sie die neue Gradle NDK-Integration in Android Studio (Gradle experimentell) verwenden, müssen Sie diese Zeile ldLibs.addAll (['android', 'log']) zu Ihren android.ndk-Optionen hinzufügen.
Sadegh Ghanbari
16

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 :

LOCAL_LDLIBS := -llog

CMakeLists.txt :

find_library( log-lib log )
target_link_libraries( ${log-lib} )

Weiterführende Literatur: Protokollierung

Onik
quelle
13

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:

adb logcat

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.

Shervin Emami
quelle
4
Beachten Sie, dass diese Lösung JUnit-Tests unterbricht. Siehe: stackoverflow.com/questions/3462850/…
Sebastian Krysmanski
fflushmuss nach jeder printf-Anweisung aufgerufen werden?
IgorGanapolsky
2

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.

c dev tools installieren

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 eine gdb.setupDatei im obj/local/armeabiOrdner). 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.

Draganstankovic
quelle
2

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());
Geng Jiawen
quelle
0

Für alle, die Probleme haben

LOCAL_LDLIBS := -llog

funktioniert nicht, fügen Sie es einfach nach jedem hinzu

include $(CLEAR_VARS)

Ich weiß nicht warum, aber es hat bei mir funktioniert.

Prost!

nutella_eater
quelle