2012-04-23 9 views
35

, wenn ich eine solche Funktion in Java-DateiWie bekomme ich "printf" Nachrichten in NDK-Anwendung geschrieben?

/** 
    * Adds two integers, returning their sum 
    */ 
    public native int add(int v1, int v2); 

so muss ich

in c-Datei kodieren bin definieren
JNIEXPORT jint JNICALL Java_com_marakana_NativeLib_add 
    (JNIEnv * env, jobject obj, jint value1, jint value2) { 

    printf("\n this is log messge \n"); 

     return (value1 + value2); 
} 

dann von dem dieser printf es Nachricht gedruckt wird? In logcate bekomme ich es nicht?

Wie kann ich jede NDK-Anwendung debuggen, indem ich Protokollnachrichten einlege?

+1

'printf (3)' schreibt auf die Ausgabe _standard_ - die in Ihrer Umgebung vorhanden sein kann oder nicht. Besser wäre es, einen unterstützten Protokollierungsmechanismus zu finden. – sarnold

Antwort

83

Verwenden Sie stattdessen __android_log_print(). Sie müssen den Header <android/log.h>

Beispiel Beispiel einschließen. __android_log_print(ANDROID_LOG_DEBUG, "LOG_TAG", "\n this is log messge \n");

Sie können auch Formatbezeichner wie printf -

__android_log_print(ANDROID_LOG_DEBUG, "LOG_TAG", "Need to print : %d %s",int_var, str_var); 

Stellen Sie sicher, auch Link gegen die Protokollierung-Bibliothek, in der Android.mk Datei:

LOCAL_LDLIBS := -llog 

Ohh .. vergessen. Die Ausgabe wird in Logcat mit dem Tag LOG_TAG

angezeigt. Einfache Annäherung

Fügen Sie Ihrer gemeinsamen Header-Datei die folgenden Zeilen hinzu.

#include <android/log.h> 

#define LOG_TAG "your-log-tag" 

#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) 
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) 
// If you want you can add other log definition for info, warning etc 

Nun rufen Sie einfach LOGD("Hello world") or LOGE("Number = %d", any_int) wie printf in c.

Vergessen Sie nicht, die gemeinsame Header-Datei aufzunehmen.

die Protokollierung entfernen

Wenn Sie LOGD(...) leer definieren, werden alle Protokolle verschwunden. Kommentieren Sie einfach nach LOGD(...).

#define LOGD(...) // __android_log..... rest of the code

+0

Wie entferne ich die Protokollierung? – powder366

+1

@ powder366 Antwort aktualisiert. Überprüfen Sie den Abschnitt zum Entfernen der Protokollierung. – Shaiful

+5

Nur für den Fall, dass jemand (z. B. ich) Android Studio verwendet (aktuelle Mine ist 0.8.11), setzen Sie ldLibs "log" in "ndk" -Tag. Dies löst einen nicht definierten Verweis auf das Problem "__android_log_print". – Yang

12

Es gibt zwei Möglichkeiten:

1) ersetzen printf mit __android_log_print. Sie können dies einfach mit define am Anfang des Codes tun:

#define printf(...) __android_log_print(ANDROID_LOG_DEBUG, "TAG", __VA_ARGS__); 

Natürlich erfordert dies die Änderung aller Quellcode, der printf hat.

2) umleiten stdout und stderr auf Android logcat (nicht sicher, ob dies auf nicht-verwurzelte Gerät funktioniert): http://developer.android.com/guide/developing/debugging/debugging-log.html#viewingStd

+0

, wenn ich Option 2 benutze, nachdem ich diesen 3 Befehl angewendet habe, wenn ich meinen Anwendungsemulator starte zeigt Android Bootanimation .. –

5

brauchen nicht Gerät zu verankern, zu http://developer.android.com/guide/developing/debugging/debugging-log.html#viewingStd acroding kann unter prefectly arbeiten.

$ adb shell 

$ su 

$ stop 

$ setprop log.redirect-stdio true 

$ start 

erledigt!

+2

su-Befehl funktioniert nicht ohne Root-Zugriff .. !! –

+0

auf jeden Fall +1 für das Aufzeigen der Methode setprop. –

+2

Diese Methode funktioniert nur auf Android-Versionen mit dalvik (4.4 oder früher), ART-Versionen (5.0 oder höher) unterstützen log.redirect-stdio nicht. Quelle: https://code.google.com/p/android/issues/detail?id=165602 – Deemoe

Verwandte Themen