android重定向cout,使用cout来打印日志:https://blog.csdn.net/lj402159806/article/details/78252984
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);