如何解决 Android 设备上 Qt 应用程序的 ClassNotFoundEception?

How can I resolve a ClassNotFoundEception of Qt app on an Android device?

我正在使用 Qt Android 和 JNI 来访问 Android API。如果我 运行 使用虚拟 Android 设备而不是物理 Android 设备的模拟器中的应用程序,这工作正常。这令人困惑。

我使用基于 Qt 5.14.0(Clang 10.0 (Apple),64 位)的 Qt Creator 4.11.0 进行开发。这是异常的堆栈跟踪:

W System.err: java.lang.ClassNotFoundException: Didn't find class "com.myapp.launcher.worker.AppWorker" on path: DexPathList[[],nativeLibraryDirectories=[/system/lib]]
W System.err:   at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
W System.err:   at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
W System.err:   at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
W System.err:   at org.qtproject.qt5.android.QtNative.startQtApplication(Native Method)
W System.err:   at org.qtproject.qt5.android.QtNative.run(QtNative.java:387)
W System.err:   at org.qtproject.qt5.android.QtThread.run(QtThread.java:61)
W System.err:   at java.lang.Thread.run(Thread.java:764)

有人知道吗?我认为这不是源代码中的错误,而是其他地方的错误,可能在工具包设置中。我为我的项目使用了 Qt 模板。

这是我的解决方案:

我根据 Qt Creator 的模板创建了一个新应用程序,并将其与 Qt example project 进行了比较 Android:

我得出结论,我必须修改 .pro 文件。首先,我必须添加以下行:

ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android-sources

然后我不得不替换 DISTFILES,它是由 Qt Creator 自动添加的,如果我创建 Java class:

OTHER_FILES += \
    main.qml \
    android-sources/src/com/hello/android/Backend.java \
    android-sources/AndroidManifest.xml

最后,我不得不在文本编辑器模式下编辑从 exmaple 项目复制的 AndroidManifest.xml

<activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|locale|fontScale|keyboard|keyboardHidden|navigation" android:name="com.hello.android.Backend" android:label="Hello Android" android:screenOrientation="unspecified">

我最初问题的项目中不需要最后一步。