android重定向cout,使用cout来打印日志

来源:互联网 发布:淘宝网电影票 编辑:程序博客网 时间:2024/05/23 01:45

android_buf.h

#include <iostream>#include <streambuf>#include <android/log.h>class AndroidBuf : public std::streambuf {    enum {        BUFFER_SIZE = 255,    };public:    AndroidBuf();    ~AndroidBuf();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();private:    char buffer_[BUFFER_SIZE + 1];};

android_buf.cpp

#include "android_buf.h"AndroidBuf::AndroidBuf() {    buffer_[BUFFER_SIZE] = '\0';    setp(buffer_, buffer_ + BUFFER_SIZE - 1);}AndroidBuf::~AndroidBuf() {    sync();}int AndroidBuf::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, "Native", buffer_);#else    printf("%s", buffer_);#endif    pbump(-len);    return len;}

指定给std::cout

#include "android_buf.h"int main() {std::cout.rdbuf(new AndroidBuf);//NOTE: std::endl会立即调用sync方法将缓冲区字符写入log,并不只是换行用std::cout << "hello " << 123 << std::endl;}

使用完记得释放引用

delete std::cout.rdbuf(0);

参考:
http://blog.csdn.net/zaffix/article/details/44226503
https://stackoverflow.com/questions/8870174/is-stdcout-usable-in-android-ndk

原创粉丝点击