Вы можете создать класс, производный от std::streambuf
, который использует специальные функции Android для отправки созданной последовательности символов.Однако я не знаю, где стандартная реализация std::cout
отправляет символы на Android.По сути, это будет выглядеть примерно так:
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];
};
Чтобы на самом деле настроить std::cout
для записи в этот потоковый буфер, вы должны сделать что-то подобное в вашей функции main()
:
int main() {
std::cout.rdbuf(new androidbuf);
...
}
Это создает утечку памяти для одного потока androidbuf
, которая, однако, является несколько преднамеренной: поток может быть записан после выхода из main()
, и он очищается, когда уничтожается std::cout
.Если вы не хотите этого, вы можете восстановить исходный потоковый буфер std::cout
или установить его в null и удалить возврат из rdbuf()
:
// avoid a one-time resource leak but don't get output afterwards:
delete std::cout.rdbuf(0);