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

use*_*812 37 c++ console android-ndk

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

std::cout << "some strings" << std::endl;
Run Code Online (Sandbox Code Playgroud)

字符串将在何处发送.

似乎Android没有控制台应用程序,并且可能无法发送上述字符串.我可以将"stdout"重定向到文件,以便将字符串发送到"std :: cout"等同于记录消息吗?

Die*_*ühl 34

您可以创建一个派生类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];
};
Run Code Online (Sandbox Code Playgroud)

要实际设置std::cout为写入此流缓冲区,您可以在main()函数中执行以下操作:

int main() {
    std::cout.rdbuf(new androidbuf);
    ...
}
Run Code Online (Sandbox Code Playgroud)

这会为一个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);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这是有效的.但它有几个错误.这是固定版本:https://gist.github.com/dzhioev/6127982 (2认同)

par*_*mar 28

根据Android文档,stdout和stderr输出到/dev/null.您可以使用Android Debug Bridge来实现您想要的效果.

默认情况下,Android系统将stdout和stderr(System.out和System.err)输出发送到/ dev/null.在运行Dalvik VM的进程中,您可以让系统将输出的副本写入日志文件.在这种情况下,系统使用日志标记stdout和stderr将消息写入日志,两者都具有优先级I.要以这种方式路由输出,请停止正在运行的模拟器/设备实例,然后使用shell命令setprop启用输出的重定向.这是你如何做到的:

$ adb shell stop
$ adb shell setprop log.redirect-stdio true
$ adb shell start
Run Code Online (Sandbox Code Playgroud)

系统将保留此设置,直到您终止仿真器/设备实例.要在模拟器/设备实例上将该设置用作默认设置,可以在设备上向/data/local.prop添加条目.