我有一个用Qt编写的Android应用程序,其基本结构与Qt Notifier示例相同:http://doc.qt.io/qt-5/qtandroidextras-notification-example.html
有一个本机droid接口使用org.qtproject.qt5.android.bindings.QtActivity类的扩展。还有一个QApplication骨干网,它们通过jni双向通信。在Qt 5.2到5.5中,一切正常。我跳过5.6,刚刚升级到5.7。现在,Java端工作,即我的Java QtActivity类被启动和显示,但应用程序就像C ++一样不存在!
当我向main.cpp添加一些qDebug()输出时,它根本不会显示在控制台上! (然而在Qt 5.5中我可以看到它没有问题)。但是,我可以从静态C ++函数中看到qDebug()输出:JNIEXPORT jint JNI_OnLoad(JavaVM * vm,void * / reserved /)
如果我通过在qmake中注释掉ANDROID_PACKAGE_SOURCE_DIR来删除本机Activity,则会调用主C ++函数。
这里发生了什么? Qt改变了什么导致了这个?
答案 0 :(得分:1)
我无法相信没有其他人遇到同样的问题!至少我找不到其他人报告此事。
我发现如果Java端QtActivity类从onCreate()调用setContentView(),那么C ++ main函数永远不会被调用!直到这个新版本的Qt,这不是问题。请注意,我在问题中引用的QtNotifier示例没有这样做,为什么它在Qt 5.7上开箱即用。
我不得不修改我的逻辑,以便Java QtActivity类执行其他初始化任务,但是省略了setContentView()来本地加载ui。然后C ++开火了。从C ++方面,我发出一个对QtActivity类的jni调用,然后使用setContentView()。请注意,我必须使用对QtActivity类的静态实例引用(我在onCreate中指定),并且我必须在main / ui线程上运行该代码。
以下是一些有用的代码片段供您放入Java QtActivity类:
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 );
}
});