How to get "printf" messages written in NDK application?
Solution 1
use __android_log_print()
instead. You have to include header <android/log.h>
Sample Example. __android_log_print(ANDROID_LOG_DEBUG, "LOG_TAG", "\n this is log messge \n");
You can also use format specifier like printf -
__android_log_print(ANDROID_LOG_DEBUG, "LOG_TAG", "Need to print : %d %s",int_var, str_var);
Make sure you also link against the logging library, in your Android.mk file:
LOCAL_LDLIBS := -llog
Ohh.. forgot .. The output will be shown in Logcat
with tag LOG_TAG
Easy Approach
Add the following lines to your common header file.
#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
Now just call LOGD("Hello world") or LOGE("Number = %d", any_int)
like printf in c
.
Don't forget to include the common header file.
Remove the logging
If you define LOGD(...)
empty, all logs will be gone. Just comment after LOGD(...)
.
#define LOGD(...) // __android_log..... rest of the code
Solution 2
There is two options:
1) replace printf with __android_log_print. You can do this easily with define at beginning of code:
#define printf(...) __android_log_print(ANDROID_LOG_DEBUG, "TAG", __VA_ARGS__);
Of course this will require changing all source code that has printf.
2) redirect stdout and stderr to Android logcat (not sure if this will work on non-rooted device): http://developer.android.com/guide/developing/debugging/debugging-log.html#viewingStd
Solution 3
not need to root device, acroding to http://developer.android.com/guide/developing/debugging/debugging-log.html#viewingStd, below can work prefectly.
$ adb shell
$ su
$ stop
$ setprop log.redirect-stdio true
$ start
done!
Jeegar Patel
Written first piece of code at Age 14 in HTML & pascal Written first piece of code in c programming language at Age 18 in 2007 Professional Embedded Software engineer (Multimedia) since 2011 Worked in Gstreamer, Yocto, OpenMAX OMX-IL, H264, H265 video codec internal, ALSA framework, MKV container format internals, FFMPEG, Linux device driver development, Android porting, Android native app development (JNI interface) Linux application layer programming, Firmware development on various RTOS system like(TI's SYS/BIOS, Qualcomm Hexagon DSP, Custom RTOS on custom microprocessors)
Updated on July 09, 2022Comments
-
Jeegar Patel almost 2 years
if i am defining such function in java file
/** * Adds two integers, returning their sum */ public native int add( int v1, int v2 );
so i need to code in c file
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); }
then from where this printf will print it message ? In logcate i dont get it?
How can i debug any NDK application by putting log messages?
-
Jeegar Patel about 12 yearswhen i use option 2 then after applying that 3 command when i run my application emulator just hang up in showing android bootanimation..
-
powder366 over 10 yearsHow do I remove the logging?
-
Yang over 9 yearsJust in case someone (e.g. me) using Android Studio (current mine is 0.8.11), you put ldLibs "log" inside 'ndk' tag. This solves undefined reference to '__android_log_print' issue.
-
Lorne K over 8 yearsAs of Android Studio 1.4 Gradle 2.5 the LOCAL_LDLIBS := -llog has moved from Android.mk to build.gradle - use 'android.ndk { moduleName = "Your-jni" ldLibs += "log" }' NOTE that .gradle syntax has changed in 2.5 (you need the '+=')
-
Deemoe about 8 yearsThis method only works on android versions running dalvik (4.4 or earlier), ART versions (5.0 or later) dont support log.redirect-stdio. Source: code.google.com/p/android/issues/detail?id=165602
-
Michael IV almost 7 yearsThat doesn't help for Visual Studio Android debugging