How to get "printf" messages written in NDK application?

67,190

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!

Share:
67,190
Jeegar Patel
Author by

Jeegar Patel

Written first piece of code at Age 14 in HTML &amp; 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, 2022

Comments

  • Jeegar Patel
    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
    Jeegar Patel about 12 years
    when i use option 2 then after applying that 3 command when i run my application emulator just hang up in showing android bootanimation..
  • powder366
    powder366 over 10 years
    How do I remove the logging?
  • Yang
    Yang over 9 years
    Just 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
    Lorne K over 8 years
    As 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
    Deemoe about 8 years
    This 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
    Michael IV almost 7 years
    That doesn't help for Visual Studio Android debugging