qt android ClassNotFoundException

qt android ClassNotFoundException

我正在使用 Qt (qml) 制作一个 android 应用程序,但我在尝试注册要从 java 调用的本机方法时遇到错误。在我的本机代码的一节中,我调用 java 静态函数没有问题:

void NotificationClient::powerOff() {
    QAndroidJniObject::callStaticMethod<void>("com/my_app/Utils",
                                       "powerOff",
                                       "()V"
                                        );
}

现在我正尝试将来自 java 的一些调用添加回我的本机代码(基于 this example)但它失败了

QAndroidJniEnvironment env;
jclass objectClass = env->FindClass("com/my_app/Utils");

结果:

Pending exception java.lang.ClassNotFoundException: Didn't find class "com.my_app.Utils" on path: DexPathList[[directory "."],nativeLibraryDirectories=[/system/lib, /vendor/lib, /system/lib, /vendor/lib]]

我检查了来自 classes.dex 的 dexdump 和 class 字符串匹配。我的 AndroidManifest.xml 中的所有路径都是绝对路径。我已经清理并重建了。没有什么可以解决这个问题,我无法弄清楚为什么静态方法调用有效但对象方法调用无效。

(是的,还有一个 ClassNotFoundException post 但我真的已经在寻找答案了)。

edit 基于创建对象的原始失败方法引发了不同的错误,所以我切换回使用 FindClass,它给出了 ClassNotFound 错误

更新 好的,所以我想我已经弄清楚 FindClass 失败的原因:根据 this FindClass 将搜索调用堆栈以确定要使用哪个 ClassLoader。通常这很好,但我相信 Qt for android 在不同的线程下加载,所以调用了错误的 ClassLoader。

link 建议在 JNI_onLoad 中缓存 classes,但在幕后使用 Qt。有没有其他地方我可以在主线程而不是 qt 线程上缓存 class id?

为了完整性回答我自己的问题...

找不到 classes 的原因是 Qt 在与主 java 线程不同的线程上运行,这导致 java classloader查找失败(请参阅问题更新中的 link)。

作为解决方案,我在我的一个 cpp 文件中添加了一个 JNI_onLoad 函数,该函数在主 java 线程上调用,因此 class 查找工作正常。