【发布时间】:2017-07-03 09:35:51
【问题描述】:
我正在为 Android 开发一个 Qt5 应用程序(使用 CMake!),目前我正在尝试使用 Qt 的 QGeoPositionInfoSource 读取位置数据。
到目前为止,我所有的应用程序都运行良好,但是当我运行时
auto source = QGeoPositionInfoSource::createDefaultSource(this);
应用程序立即崩溃,logcat 给了我:
I/__log_qt( 422): (II) dpw_qt5: <last output from my app>
F/libc ( 422): Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 797 (QtThread)
I/DEBUG ( 333): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG ( 333): Build fingerprint: 'samsung/trltexx/trlte:5.0.1/LRX22C/N910FXXU1BOE3:user/release-keys'
I/DEBUG ( 333): Revision: '12'
I/DEBUG ( 333): ABI: 'arm'
I/DEBUG ( 333): pid: 422, tid: 797, name: QtThread >>> org.qtproject.DPW <<<
I/DEBUG ( 333): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
I/DEBUG ( 333): r0 00000000 r1 9d2bedf8 r2 00010006 r3 be7eb61d
I/DEBUG ( 333): r4 9d2bedf4 r5 9d2bedf8 r6 00000000 r7 9cffa030
I/DEBUG ( 333): r8 9d2bedf4 r9 afd04388 sl 00000001 fp 9d2bf8dc
I/DEBUG ( 333): ip 9cff9e80 sp 9d2bedd0 lr 9cff49b7 pc 9cff612e cpsr 60070030
I/DEBUG ( 333):
I/DEBUG ( 333): backtrace:
I/DEBUG ( 333): #00 pc 0000512e /data/data/org.qtproject.DPW/qt-reserved-files/plugins/position/libqtposition_android.so
I/DEBUG ( 333): #01 pc 000039b3 /data/data/org.qtproject.DPW/qt-reserved-files/plugins/position/libqtposition_android.so
我使用了最后三个 Android NDK 和从 5.6 到 5.9 的几个版本的 Qt - 结果都相同,所以我认为我系统性地做错了。
我的AndroidManifest.xml 包含以下几行:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
您对我可以从哪里开始调查有什么想法吗?
更新:
我一直在追溯调用堆栈的最顶层:
I/DEBUG ( 333): #00 pc 0000512e /data/data/org.qtproject.DPW
我发现jnipositioning.cpp 中的以下行导致了崩溃:
if (javaVM->GetEnv((void**)&jniEnv, JNI_VERSION_1_6) < 0) {
所以新的问题是:什么会使javavm->GetEnv()(在jni.h 中声明)崩溃?
另一个更新:
jpo38 指出使用 qmake 构建会导致 Android 应用程序不会崩溃。我已经设置了一个 github project 来展示这种行为。
所以现在的问题是:使用 CMake 和 qmake 配置的应用程序之间有什么区别?
【问题讨论】:
-
您应该尝试报告 Qt 错误。
-
好。希望您能尽快得到答复。我建议您在 Qt 错误报告中发布 MCVE。当您这样做时,他们会更快地发现问题。祝你好运。
-
您是否尝试注册消息处理程序(qInstallMessageHandler)并查看是否在系统崩溃之前收到消息?
-
您是否在您的
.pro文件中添加了QT += positioning?您是否创建了QGuiApplication对象的实例?
标签: android c++ qt android-ndk location