I can't get my Nexus S (running Android 4.0) to redirect native stdout message to logcat. I've read that I need to do this:
$ adb shell stop $ adb shell setprop log.redirect-stdio true $ adb shell start
However, this doesn't seem to work. (It does break JUnit though, as mentioned here, so it's not without effect.)
For reference, here's my code:
package com.mayastudios; import android.util.Log; public class JniTester { public static void test() { Log.e("---------", "Start of test"); System.err.println("This message comes from Java."); void printCMessage(); Log.e("---------", "End of test"); } private static native int printCMessage(); static { System.loadLibrary("jni_test"); } }
And the JNI .c file:
JNIEXPORT void JNICALL Java_com_mayastudios_JniTester_printCMessage(JNIEnv *env, jclass cls) { setvbuf(stdout, NULL, _IONBF, 0); printf("This message comes from C (JNI).\n"); fflush(stdout); //setvbuf(stderr, NULL, _IONBF, 0); //fprintf(stderr, "This message comes from C (JNI).\n"); //fflush(stderr); }
And the Android.mk:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := jni_test LOCAL_SRC_FILES := test_jni.c include $(BUILD_SHARED_LIBRARY)
I'm compiling this just by calling ndk-build
. The native method is called correctly but I don't get any log output from it (even on verbose). I do get the log output from Java though ("This message comes from Java.").
Any hints of what I might be doing wrong?
PS: I've set up a small Mercurial repository that demonstrates the problem: https://bitbucket.org/skrysmanski/android-ndk-log-output/
setprop log.redirect-stdio true
redirects only output generated by java code, but not the native code. This fact is described on developer.android.com in following way:
By default, the Android system sends stdout and stderr (System.out and System.err) output to /dev/null. In processes that run the Dalvik VM, you can have the system write a copy of the output to the log file.
To get output from the native code, I really liked this solution
This was not obvious to me from the previous answers. Even on rooted devices you need to run:
adb root adb shell stop adb shell setprop log.redirect-stdio true adb shell start
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With