Подтвердить что ты не робот

Qt5 QGeoPositionInfoSource:: createDefaultSource() падает на Android 5.0

Я разрабатываю приложение Qt5 для Android (с 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 и несколько версий Qt с 5.6 до 5.9 - все с одинаковым результатом, поэтому я думаю, что я делаю что-то неправильно систематически.

My AndroidManifest.xml содержит следующие строки:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

У вас есть идеи для меня, где я могу начать расследование?

Update:

Я отслеживаю верхнюю часть строки вызова:

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, демонстрируя это поведение.

Итак, вопрос в следующем: какая разница между настройками приложений с CMake и qmake?

4b9b3361

Ответ 1

Это, по-видимому, работает очень хорошо:

TestGeo.pro:

QT += core gui
QT += positioning
QT += widgets

TARGET = TestGeo
TEMPLATE = app

SOURCES += main.cpp

CONFIG += mobility
MOBILITY = 

main.cpp:

#include <QMainWindow>
#include <QApplication>

#include <QGeoPositionInfoSource>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QMainWindow w;

    qDebug() << "Creating";
    auto source = QGeoPositionInfoSource::createDefaultSource(&a);
    if ( source )
        qDebug() << "Created";
    else
        qDebug() << "NULL";

    w.show();

    return a.exec();
}

Выходы программы без сбоев:

Creating
Created

Обратите внимание, что я добавил в проект no AndroidManifest.xml. Он работает как с включенной, так и с отключенной "Локализацией".

Я развертываю с Android-22 target на Nexus 6 с помощью Android 5.1 (armeabi-v7a). Используя Qt 5.6 (GCC 4.9). Использование NDK r11b.

В вашей настройке должно быть что-то не так.

Так что сделайте эту настройку, сгенерируйте рабочий apk. Затем извлеките содержимое этого рабочего apk и вашего неудачного apk. Проверяя различия (отсутствующие библиотеки, файлы, разные манифесты....), вы можете определить, что не так с вашей средой сборки и развертывания CMake, а затем исправить ее (возможно, вручную копируя отсутствующие файлы в проекте CMake)!

В вашем случае ссылки на библиотеки позиционирования Qt отсутствуют. Просто добавьте их правильно в AndroidManifest.xml:

<meta-data android:name="android.app.load_local_libs" android:value="plugins/platforms/android/libqtforandroid.so:plugins/position/libqtposition_android.so"/>
<meta-data android:name="android.app.load_local_jars" android:value="jar/QtAndroid.jar:jar/QtAndroidAccessibility.jar:jar/QtAndroid-bundled.jar:jar/QtAndroidAccessibility-bundled.jar:jar/QtPositioning.jar:jar/QtPositioning-bundled.jar"/>
<meta-data android:name="android.app.static_init_classes" android:value="org.qtproject.qt5.android.positioning.QtPositioning:org.qtproject.qt5.android.positioning.QtPositioning"/>