2016-12-01 5 views
1

ich eine Android-App in Qt geschrieben haben, die die gleiche Grundstruktur wie das Qt Notifier Beispiel hat: http://doc.qt.io/qt-5/qtandroidextras-notification-example.htmlJava ausgeführt wird, aber nicht C++ in Qt 5.7 für Android (in früheren Qt gearbeitet)

Es ist eine native droid-Schnittstelle Verwenden einer Erweiterung für die Klasse org.qtproject.qt5.android.bindings.QtActivity. Es gibt auch einen QApplication Backbone und sie kommunizieren bidirektional über jni. In Qt 5.2 bis 5.5 hat alles gut funktioniert. Ich habe 5.6 übersprungen und gerade auf 5.7 aufgerüstet. Nun funktioniert die Java-Seite, d. H. Meine Java QtActivity-Klasse wird gestartet und angezeigt, aber die App verhält sich so, als ob C++ nicht existiert!

Wenn ich einige qDebug() - Ausgabe zu main.cpp hinzufügen, wird es überhaupt nicht auf der Konsole angezeigt! (Aber in Qt 5.5 kann ich es ohne Probleme sehen). Ich kann jedoch sehen qDebug() -Ausgabe von meiner statischen C++ Funktion: JNIEXPORT JINT JNI_OnLoad (JavaVM * vm, void */vorbehalten /)

Wenn ich durch Kommentare aus ANDROID_PACKAGE_SOURCE_DIR in meinem qmake die native Aktivität entfernen, dann wird die Haupt-C++ - Funktion aufgerufen.

Was geht hier vor? Was hat sich in Qt geändert, um dies zu verursachen?

Antwort

1

Ich kann nicht glauben, dass sonst niemand dieses gleiche Problem gehabt hat! Zumindest kann ich niemanden finden, der das meldet.

Ich fand, dass, wenn die Java-Seite QtActivity-Klasse setContentView() von onCreate() aufruft, die C++ - Hauptfunktion nie aufgerufen wird! Dies war bis zur neuen Version von Qt kein Problem. Beachten Sie, dass das QtNotifier-Beispiel, auf das ich in meiner Frage verwiesen habe, das nicht tut, weshalb es auf Qt 5.7 standardmäßig ausgeführt wird.

Ich musste meine Logik so überarbeiten, dass die Java QtActivity-Klasse andere Initialisierungsaufgaben ausführt, aber setContentView() auslässt, um die ui nativ zu laden. Dann feuert das C++ ab. Von der C++ - Seite aus gebe ich einen jni-Aufruf an die QtActivity-Klasse aus, die dann setContentView() verwendet. Beachten Sie, dass ich einen statischen Instanzverweis auf die QtActivity-Klasse verwenden muss (die ich in onCreate zuweisen), und ich muss diesen Code auf dem Haupt/ui-Thread ausführen.

Hier sind einige nützliche Code-Snippets für Sie in eine Java QtActivity Klasse fallen zu lassen:

private static MyQtActivityClass instance_; 
private static Handler mainHandler_; 

...

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    instance_ = this; 
    context_ = this.getApplicationContext(); 
    mainHandler_ = new Handler(Looper.getMainLooper()); 
} 

public static void runOnMainThread(Runnable runnable) { 
    mainHandler_.post(runnable); 
} 

...

runOnMainThread(new Runnable() { 
     public void run() { 
      instance_.setContentView(R.layout.XXXXXX); 
     } 
    }); 
Verwandte Themen