2017-02-14 4 views
13

Ich entwickle eine Qt5-Anwendung für Android (mit CMake!) Und derzeit versuche ich, Standortdaten mit Qt QGeoPositionInfoSource zu lesen. Alle meine Anwendung tut so weit in Ordnung, aber wenn ichQt5 QGeoPositionInfoSource :: createDefaultSource() stürzt auf Android 5.0

laufen
auto source = QGeoPositionInfoSource::createDefaultSource(this); 

stürzt die Anwendung sofort und logcat gibt mir:

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 

Ich habe die letzten drei Android NDKs und mehrere Versionen verwendet von Qt von 5,6 bis 5,9 - alle mit dem gleichen Ergebnis, also denke ich, dass ich systematisch etwas falsch mache.

Meine AndroidManifest.xml enthält die folgenden Zeilen:

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

Haben Sie für mich eine Ahnung, wo ich anfangen kann, zu untersuchen?

Update:

Ich habe die oberste Zeile des Call-Stack Tracing zurück:

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

und ich fand heraus, dass die folgende Zeile innerhalb jnipositioning.cpp den Absturz verursacht:

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

so ist die neue Frage: Was kann javavm->GetEnv() machen (indeklariert 10) Absturz?

Ein weiteres Update:

jpo38 wies darauf hin, dass das Gebäude mit qmake Ergebnissen in einem Android-App, die nicht abstürzt. Ich habe ein github project eingerichtet, das dieses Verhalten demonstriert.

Die Frage ist nun: Was ist der Unterschied zwischen den Apps, die mit CMake und qmake konfiguriert werden?

+0

Sie sollten versuchen, einen Qt-Fehler zu melden. – jpo38

+0

Ich habe: https://bugreports.qt.io/browse/QTBUG-59010 – frans

+0

Gut. Hoffentlich bekommen Sie bald eine Antwort. Ich empfehle Ihnen, einen MCVE in Ihren Qt-Fehlerbericht zu posten. Sie sehen schneller auf Probleme, wenn Sie dies tun. Viel Glück. – jpo38

Antwort

1

Das funktioniert anscheinend ziemlich gut:

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

Programmausgänge ohne Absturz:

Creating 
Created 

Hinweis dass ich keinehinzugefügt habeDatei zum Projekt. Es funktioniert sowohl mit "Lokalisierung" aktiviert oder deaktiviert.

Ich bin mit Android-22 Ziel auf Nexus 6 mit Android 5.1 (armeabi-v7a) bereitstellen. Mit Qt 5.6 (GCC 4.9). Verwenden von NDK r11b.

Es muss etwas mit Ihrem Setup nicht stimmen.

Also diese Einrichtung, generieren Sie die Arbeits apk. Dann extrahieren Sie den Inhalt dieser Arbeitsapk und Ihre fehlerhafte apk. Durch das Überprüfen der Unterschiede (fehlende Bibliotheken, Dateien, anderes Manifest ...) können Sie möglicherweise feststellen, was mit Ihrer CMake-Build- und Implementierungsumgebung nicht stimmt und Sie später beheben (möglicherweise durch das manuelle Kopieren fehlender Dateien im CMake-Projekt)!

In Ihrem Fall fehlen die Verweise auf die Positionierungsbibliotheken von Qt. Fügen Sie sie einfach richtig zu Ihrem AndroidManifest.xml hinzu:

<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"/> 
+0

Ich habe sein Beispiel in Bugreport angeschaut. Er benutzt CMake und VS, um sein Projekt aufzubauen. – Evgeny

+0

Man sollte von einer funktionierenden Lösung (QtCreator, einfach .pro, Basisprogramm) ausgehen und dann verfolgen, was in einer komplexeren Lösung (VS, CMake ...) anders ist, um zu sehen, was den Absturz verursacht ... Vielleicht wird VS nicht bereitstellen das Programm richtig – jpo38

+0

Nun - ich benutze CMake aber nicht VS. Ich ty jpo Ansatz - ein 'qmake' Projekt in ein CMake Projekt zu verwandeln. – frans

Verwandte Themen