实际上,结合问题中链接的两个解决方案的各个方面至少可以将其简化为一个函数:
const char*const applicationName="myapp";
#ifdef ANDROIDQUIRKS // Set in my myapp.pro file for android builds
#include <android/log.h>
void myMessageHandler(
QtMsgType type,
const QMessageLogContext& context,
const QString& msg
) {
QString report=msg;
if (context.file && !QString(context.file).isEmpty()) {
report+=" in file ";
report+=QString(context.file);
report+=" line ";
report+=QString::number(context.line);
}
if (context.function && !QString(context.function).isEmpty()) {
report+=+" function ";
report+=QString(context.function);
}
const char*const local=report.toLocal8Bit().constData();
switch (type) {
case QtDebugMsg:
__android_log_write(ANDROID_LOG_DEBUG,applicationName,local);
break;
case QtInfoMsg:
__android_log_write(ANDROID_LOG_INFO,applicationName,local);
break;
case QtWarningMsg:
__android_log_write(ANDROID_LOG_WARN,applicationName,local);
break;
case QtCriticalMsg:
__android_log_write(ANDROID_LOG_ERROR,applicationName,local);
break;
case QtFatalMsg:
default:
__android_log_write(ANDROID_LOG_FATAL,applicationName,local);
abort();
}
}
#endif
...
int main(int argc,char* argv[]) {
QGuiApplication app(argc,argv);
#ifdef ANDROIDQUIRKS
qInstallMessageHandler(myMessageHandler);
#endif
app.setApplicationName(applicationName);
...
这会得到类似的东西qInfo() <<
来自 C++ 的消息and console.log
来自 QML 的消息。它没有得到的是 stdout/stderr 输出,但我可以接受可以在整个过程中使用 Qt 日志记录的新代码。
在logcat中,QML代码Component.onCompleted: console.log("QML completed")
结果是
08-02 12:27:53.378 1199 1220 D myapp : QML completed in file qrc:///main.qml line 7 function onCompleted
以及 C++ 中的代码qInfo() << "QQuickViewer setup completed";
产生
08-02 12:27:53.562 1199 1220 I myapp : QQuickViewer setup completed
即使在实例化 QGuiApplication 之前安装消息处理程序似乎也同样有效,但它不会生成任何额外的输出(我注意到 iOS 上的 Qt 在启动时会向 xcode 控制台喷出各种内容,例如链接到的性能警告https://wiki.qt.io/V4 https://wiki.qt.io/V4并想知道 Android 是否也这样做;但如果它发出任何东西,它一定是在我的处理程序安装之前)。