Qt5 QGeoPositionInfoSource :: createDefaultSource () se bloquea en Android 5.0

Estoy desarrollando una aplicación Qt5 para Android (con CMake!) Y actualmente estoy tratando de leer datos de localización usando QGeoPositionInfoSource de Qt. Toda mi aplicación está haciendo bien hasta ahora pero cuando corro

 auto source = QGeoPositionInfoSource::createDefaultSource(this); 

La aplicación se bloquea inmediatamente y logcat me da:

 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 

He utilizado los últimos tres Android NDKs y varias versiones de Qt de 5.6 a 5.9 – todos con el mismo resultado, así que creo que estoy haciendo algo mal sistemáticamente.

Mi AndroidManifest.xml contiene las siguientes líneas:

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

¿Tienes idea de dónde puedo empezar a investigar?

Actualizar:

He estado rastreando la línea más alta de la pila de llamadas:

 I/DEBUG ( 333): #00 pc 0000512e /data/data/org.qtproject.DPW 

Y descubrí que la siguiente línea dentro de jnipositioning.cpp causa el fallo:

 if (javaVM->GetEnv((void**)&jniEnv, JNI_VERSION_1_6) < 0) { 

Por lo que la nueva pregunta es: ¿qué puede hacer javavm->GetEnv() (declarado en jni.h ) bloqueo?

Otra actualización:

Jpo38 señaló que ese edificio con qmake resulta en una aplicación de Android que no se bloquea. He creado un proyecto github demostrando este comportamiento.

Así que la pregunta es ahora: ¿Cuál es la diferencia entre las aplicaciones que se configuran con CMake y qmake?

Esto aparentemente funciona bastante bien:

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(); } 

Salidas del programa sin bloqueo:

 Creating Created 

Tenga en cuenta que no he añadido ningún archivo AndroidManifest.xml al proyecto. Funciona tanto con "Localización" activada o desactivada.

Estoy desplegando con el objetivo Android-22 en Nexus 6 con Android 5.1 ( armeabi-v7a ). Utilizando Qt 5.6 ( GCC 4.9 ). Utilizando NDK r11b .

Debe haber algo mal con su configuración.

Así que hacer esta configuración, generar el apk de trabajo. A continuación, extraer el contenido de este apk de trabajo y su apk de falla. Al comprobar las diferencias (bibliotecas, archivos, manifiesto diferente …), puede identificar lo que está mal con su entorno de creación y despliegue de CMake y arreglarlo posteriormente (posiblemente copiando manualmente los archivos que faltan en el proyecto CMake).

En su caso, faltan las referencias a las bibliotecas de posicionamiento de Qt. Sólo tienes que añadirlos correctamente a tu 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"/> 
  • Actualizaciones de ubicación de Android en un servicio
  • LocationClient no se puede resolver con un tipo
  • Más de un proveedor de ubicación al mismo tiempo
  • ¿Cómo puedo obtener las coordenadas de un mapa al toque con MapFragment (no MapView)?
  • Android: compruebe si los servicios de ubicación están habilitados utilizando el proveedor de ubicación fusionado
  • La aplicación de Android no puede acceder a la ubicación en el emulador mediante FusedLocationApi
  • Diferencia entre LocationRequest setInterval (long millis) y LocationRequest setFastestInterval (long millis)
  • Android Context sin estar en una actividad? ¿Y otra programación sin actividad?
  • Cambio de idioma dentro de la aplicación Android
  • Android Advertencia: JAR no existe o no contiene recursos
  • Android Locationprovider tarda demasiado tiempo en llegar a estar temporalmente no disponible
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.