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输出了。

你可能感兴趣的:(android,NDK)