在Android-ndk中,我们可以使用“__android_log_write”,“__android_log_print”,...等将消息输出到“LogCat”窗口。如果我使用“std::cout”来输出一些字符串呢?例如:
std::cout << "some strings" << std::endl;
字符串将被发送到哪里。
Android似乎没有控制台应用程序,上述字符串可能无法发送。我可以将“stdout”重定向到一个文件,这样发送字符串到“std::cout”就相当于记录消息吗?
5条答案
按热度按时间yyhrrdl81#
您可以创建一个从
std::streambuf
派生的类,它使用Android特定的函数来发送生成的字符序列。但是,我不知道std::cout
的默认实现在Android上发送字符的位置。基本上,它看起来像这样:要真正设置
std::cout
来写入这个流缓冲区,您可以在main()
函数中执行以下操作:这为一个
androidbuf
流创建了内存泄漏,然而,这在某种程度上是故意的:可以在退出main()
之后写入流,并且当std::cout
被破坏时刷新该流。如果你不想这样,你可以恢复std::cout
的原始流缓冲区,或者将其设置为null并删除rdbuf()
的返回:9rygscc12#
根据Android文档,stdout & stderr输出到
/dev/null
。您可以使用**Android Debug Bridge**来实现您想要的。默认情况下,Android系统将stdout和stderr(System.out和System.err)输出发送到/dev/null。在运行Dalvik VM的进程中,您可以让系统将输出的副本写入日志文件。在本例中,系统使用日志标记stdout和stderr(两者的优先级都为I)将消息写入日志。要以这种方式路由输出,请停止正在运行的模拟器/设备示例,然后使用shell命令setprop启用输出重定向。你应该这么做:
系统将保留此设置,直到您终止模拟器/设备示例。要将该设置用作模拟器/设备示例上的默认设置,可以在设备上的/data/local.prop中添加一个条目。
zlhcx6iw3#
另一个选择:
优点:
(1)消息立即打印。
缺点:
(1)你必须修改你的代码(std::cout -> MY_LOG(X))。
(2)每一个单一的打印产生一个对象和破坏它。
(***This answer base on this answer)
ojsjcaue4#
Dietmar Kühl的答案非常好,但它不适用于Crystax NDK的boost.log。我找到了another idea,并进行了一些更正。代码如下:
其用途:
现在boost.log到std::cout和std::cerr的所有输出都将在logcat中:
3pmvbmvn5#
在android studio logcat中打印日志的简单方法。
步骤1:将以下行添加到公共头文件中。
第二步:现在打电话
第三步:你可以在logcat中看到如下的日志。