Android NDK重定向std::cout输出到log

来源:互联网 发布:python is equal 编辑:程序博客网 时间:2024/04/27 15:19

转自:http://www.2cto.com/kf/201503/382062.html

第一步,继承std::streambuf

#include <iostream>#include <streambuf> class MyStreamBuf : public std::streambuf{    enum    {        BUFFER_SIZE = 255,    }; public:    MyStreamBuf()    {        buffer_[BUFFER_SIZE] = '\0';        setp(buffer_, buffer_ + BUFFER_SIZE - 1);    }     ~MyStreamBuf()    {        sync();    } protected:    virtual int_type overflow(int_type c)    {        if (c != EOF)        {            *pptr() = c;            pbump(1);        }        flush_buffer();        return c;    }     virtual int sync()    {        flush_buffer();        return 0;    } private:    int flush_buffer()    {        int len = int(pptr() - pbase());        if (len <= 0)            return 0;         if (len <= BUFFER_SIZE)            buffer_[len] = '\0'; #ifdef ANDROID          android_LogPriority t = ANDROID_LOG_INFO;        __android_log_write(t, "mylog", buffer_);#else         printf("%s", buffer_);#endif           pbump(-len);        return len;    } private:    char buffer_[BUFFER_SIZE + 1];};
第二步,创建MyStreamBuf对象,并指定给std::cout

MyStreamBuf g_MyStreamBuf; std::cout.rdbuf(&g_MyStreamBuf); //NOTE: std::endl会立即调用sync方法将缓冲区字符写入log,并不只是换行用std::cout << "hello " << 123 << std::endl;std::cout << "pi = " << 3.14 << std::endl;

这样,就可以是Eclipse的LogCat查看std::cout输出了。

0 0
原创粉丝点击