Java在Qt 5.7 for Android中执行但不执行C ++(在之前的Qt中工作)

时间:2016-12-01 21:35:13

标签: java android c++ qt

我有一个用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改变了什么导致了这个?

1 个答案:

答案 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 );
        }
    });