美文网首页
Android 查看stderr和stdout

Android 查看stderr和stdout

作者: 挚爱蔚然 | 来源:发表于2020-03-18 23:45 被阅读0次

    之前在调用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);
        }
    }
    

    相关文章

      网友评论

          本文标题:Android 查看stderr和stdout

          本文链接:https://www.haomeiwen.com/subject/dzuhyhtx.html