gpt4 book ai didi

c++ - "std::cout"在 Android-ndk 中是否可用

转载 作者:IT老高 更新时间:2023-10-28 12:32:02 32 4
gpt4 key购买 nike

在 Android-ndk 中,我们可以使用“__android_log_write”、“__android_log_print”等来将消息输出到“LogCat”窗口。如果我使用“std::cout”输出一些字符串怎么样?例如

std::cout << "some strings" << std::endl;

字符串将被发送到哪里。

Android好像没有Console Applications,上面的字符串可能发不出去。我可以将“stdout”重定向到一个文件,以便将字符串发送到“std::cout”相当于记录消息吗?

最佳答案

您可以创建一个派生自 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);

关于c++ - "std::cout"在 Android-ndk 中是否可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8870174/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com