Tôi không thể mua Nexus S của mình (chạy Android 4.0) để chuyển hướng thông báo xuất bản gốc sang logcat. Tôi đã đọc rằng tôi cần phải làm điều này:Chuyển hướng stdout sang logcat trong Android NDK
$ adb shell stop
$ adb shell setprop log.redirect-stdio true
$ adb shell start
Tuy nhiên, điều này dường như không hiệu quả. (Nó phá vỡ JUnit tuy nhiên, như đã đề cập here, do đó, nó không phải không có hiệu lực.)
Để tham khảo, đây là mã của tôi:
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");
}
}
Và file .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);
}
Và Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := jni_test
LOCAL_SRC_FILES := test_jni.c
include $(BUILD_SHARED_LIBRARY)
Tôi đang biên soạn điều này chỉ bằng cách gọi ndk-build
. Phương thức nguyên gốc được gọi chính xác nhưng tôi không nhận được bất kỳ đầu ra bản ghi nào từ nó (ngay cả trên tiết). Tôi nhận được đầu ra đăng nhập từ Java mặc dù ("Thông báo này đến từ Java.").
Bất kỳ gợi ý nào về những gì tôi có thể đang làm sai?
PS: Tôi đã thiết lập một kho Mercurial nhỏ mà chứng tỏ vấn đề: https://bitbucket.org/skrysmanski/android-ndk-log-output/
Kiểm tra câu trả lời của tôi trong questino này - http : //stackoverflow.com/questions/10274920/how-to-get-printf-messgaes-written-in-ndk-application/10275209#10275209 – Shaiful
Tôi biết về giải pháp này (và đó là những gì tôi đã sử dụng). Tuy nhiên, câu hỏi ban đầu vẫn còn. Có lẽ nó chỉ là một lỗi. –
Bạn đã thử xóa cuộc gọi setvbuf chưa? Tôi có printf follwed bởi fflush hiển thị trong nhật ký một cách chính xác trong mã mà không sử dụng setvbuf. –