之前在调用ncnn库进行图片识别到时候,程序莫名到报错奔溃,查看logcat的时候也看不到具体的奔溃原因,查看源码的时候发现作者的日志写在了stderr中如fprintf(stderr, "AAssetManager_open %s failed\n", assetpath);
,网上查看了Android下查看stdout和stderr的方法都是下面的做法:
查看Android系统的stdout和stderr
Android系统在默认情况下,将stdout和stderr(Java中的System.out 和 System.err)重定向到/dev/null。
如果一个进程运行了 Dalvik VM,那么就可以把上面两个输出拷贝到日志文件中去,这种情况下,系统会把stdout和stderr输出到标签为“stdout”和“stderr”的日志中。
具体做法如下:
$ adb shell stop
$ adb shell setprop log.redirect-stdio true
$ adb shell start
(以上命令执行之后立即生效,不过,如果重启手机,则上面的设置就消失了。
可以在 /data/local.prop 文件中加入命令,从而无需重新执行以上命令。)
但是我试了以后发现手机是需要处于root状态的,不是我想要的答案,找了好久,在stackoverflow找到一个相似的问题https://stackoverflow.com/questions/9192749/capturing-stdout-stderr-with-ndk/
它是在Java代码中开启一个子线程
new Thread() {
public void run() {
nativePipeSTDERRToLogcat();
}
}.start();
然后通过jni调用一个C++的方法,通过循环去不断查找stderr缓存中的数据,然后用ndk中的log方法打印在logcat中
extern "C" void Java_com_test_yourApp_yourJavaClass_nativePipeSTDERRToLogcat(JNIEnv* env, jclass cls, jobject obj)
{
int pipes[2];
pipe(pipes);
dup2(pipes[1], STDERR_FILENO);
FILE *inputFile = fdopen(pipes[0], "r");
char readBuffer[256];
while (1) {
fgets(readBuffer, sizeof(readBuffer), inputFile);
__android_log_write(2, "stderr", readBuffer);
}
}
网友评论