Bạn có thể tạo lớp bắt nguồn từ std::streambuf
sử dụng các chức năng cụ thể của Android để gửi chuỗi ký tự được tạo ra. Tôi không biết nơi triển khai mặc định của std::cout
gửi các ký tự trên Android, tuy nhiên. Về cơ bản, điều này sẽ giống như thế này:
class androidbuf : public std::streambuf {
public:
enum { bufsize = 128 }; // ... or some other suitable buffer size
androidbuf() { this->setp(buffer, buffer + bufsize - 1); }
private:
int overflow(int c)
{
if (c == traits_type::eof()) {
*this->pptr() = traits_type::to_char_type(c);
this->sbumpc();
}
return this->sync()? traits_type::eof(): traits_type::not_eof(c);
}
int sync()
{
int rc = 0;
if (this->pbase() != this->pptr()) {
char writebuf[bufsize+1];
memcpy(writebuf, this->pbase(), this->pptr() - this->pbase());
writebuf[this->pptr() - this->pbase()] = '\0';
rc = __android_log_write(ANDROID_LOG_INFO, "std", writebuf) > 0;
this->setp(buffer, buffer + bufsize - 1);
}
return rc;
}
char buffer[bufsize];
};
Để thực sự thành lập std::cout
để viết thư cho bộ đệm dòng này, bạn sẽ làm điều gì đó như thế này trong chức năng main()
của bạn:
int main() {
std::cout.rdbuf(new androidbuf);
...
}
này tạo ra một ký ức rò rỉ cho một luồng androidbuf
, tuy nhiên, có chủ ý: luồng có thể được ghi sau main()
bị thoát và nó bị xóa khi khi std::cout
bị hủy. Nếu bạn không muốn điều này, bạn có thể khôi phục một trong hai dòng đệm ban đầu std::cout
's hoặc thiết lập nó để null và xóa sự trở lại từ rdbuf()
:
// avoid a one-time resource leak but don't get output afterwards:
delete std::cout.rdbuf(0);
Nguồn
2012-01-15 14:13:00
tập hợp con: chuyển hướng stdout để logcat: http://stackoverflow.com/questions/10531050/redirect-stdout-to-logcat-in-android-ndk –
trùng lặp có thể có của [C/C++ printfs - Nó xuất hiện ở đâu trong mã gốc của Android?] (Https://stackoverflow.com/questions/6426911/cc-printfs-wheres-it-appears-in-a-android-native-code) –