gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:19:57 25 4
gpt4 key购买 nike

我有一个用 Qt 编写的 Android 应用程序,它具有与 Qt Notifier 示例相同的基本结构:http://doc.qt.io/qt-5/qtandroidextras-notification-example.html

有一个本地机器人界面使用类 org.qtproject.qt5.android.bindings.QtActivity 的扩展。还有一个 QApplication 主干,它们通过 jni 进行双向通信。在 Qt 5.2 到 5.5 中,一切正常。我跳过了 5.6,刚升级到 5.7。现在,Java 端工作了,即我的 Java QtActivity 类已启动并显示,但该应用程序的行为就像 C++ 不存在一样!

当我将一些 qDebug() 输出添加到 main.cpp 时,它根本没有显示在控制台上! (但在 Qt 5.5 中我可以毫无问题地看到它)。但是,我可以看到静态 C++ 函数的 qDebug() 输出:JNIEXPORT jint JNI_OnLoad( JavaVM* vm, void*/reserved/)

如果我通过在我的 qmake 中注释掉 ANDROID_PACKAGE_SOURCE_DIR 来删除 native Activity,则会调用主 C++ 函数。

这是怎么回事? Qt 中发生了什么变化导致了这种情况?

最佳答案

我不敢相信没有其他人遇到过同样的问题!至少我找不到其他人报告此事。

我发现如果Java端的QtActivity类从onCreate()调用setContentView(),那么C++的main函数永远不会被调用!在这个新版本的 Qt 之前,这不是问题。请注意,我在问题中引用的 QtNotifier 示例并没有这样做,这就是为什么它在开箱即用的 Qt 5.7 上运行的原因。

我不得不修改我的逻辑,以便 Java QtActivity 类执行其他初始化任务,但省去了 setContentView() 以本地加载 ui。然后 C++ 启动。从 C++ 方面,我向 QtActivity 类发出 jni 调用,然后该类使用 setContentView()。请注意,我必须使用 QtActivity 类的静态实例引用(我在 onCreate 中分配),并且我必须在主/ui 线程上运行该代码。

这里有一些有用的代码 fragment ,您可以将它们放入 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 );
}
});

关于Java 在 Qt 5.7 for Android 中执行但不执行 C++(在之前的 Qt 中工作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40920822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com