No puedo obtener mi Nexus S (con Android 4.0) para redirigir el mensaje nativo stdout a logcat. He leído que necesito hacer esto:redireccionar stdout a logcat en Android NDK
$ adb shell stop
$ adb shell setprop log.redirect-stdio true
$ adb shell start
Sin embargo, esto no parece funcionar. (Lo hace romper JUnit embargo, como se mencionó here, así que no es sin efecto).
Como referencia, aquí está mi código:
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");
}
}
y el archivo .c JNI:
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);
}
y el Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := jni_test
LOCAL_SRC_FILES := test_jni.c
include $(BUILD_SHARED_LIBRARY)
estoy compilando esto simplemente llamando ndk-build
. El método nativo se llama correctamente pero no obtengo ningún resultado de registro (incluso en verbose). Sin embargo, obtengo el resultado de registro de Java ("Este mensaje proviene de Java").
¿Algún indicio de lo que podría estar haciendo mal?
PS: He creado un pequeño repositorio de Mercurial que demuestra el problema: https://bitbucket.org/skrysmanski/android-ndk-log-output/
comprobar mi respuesta en este questino - http : //stackoverflow.com/questions/10274920/how-to-get-printf-messgaes-written-in-ndk-application/10275209#10275209 – Shaiful
Conozco esta solución (y eso es lo que terminé usando). Sin embargo, la pregunta original aún permanece. Tal vez es solo un error. –
¿Has intentado eliminar la llamada setvbuf? Tengo printf seguido por fflush que aparece en el registro correctamente en el código que no usa setvbuf. –