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

第一步。继承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输出了。

转载于:https://www.cnblogs.com/ljbguanli/p/6767101.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值