【发布时间】:2016-12-28 20:02:52
【问题描述】:
我正在使用 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 并且类字符串匹配。我的 AndroidManifest.xml 中的所有路径都是绝对路径。我已经清理并重建了。没有什么能解决这个问题,我不知道为什么静态方法调用有效,而对象调用无效。
(是的,还有一篇 ClassNotFoundException 帖子,但我真的已经在寻找答案了)。
edit基于创建对象的原始失败方法引发了不同的错误,因此我切换回使用 FindClass,它给出了 ClassNotFound 错误
更新 好的,所以我想我已经弄清楚 FindClass 失败的原因:根据this FindClass 将搜索调用堆栈以找出要使用的 ClassLoader。通常这很好,但我相信 Qt for android 会在不同的线程下加载,因此会调用错误的 ClassLoader。
该链接建议在 JNI_onLoad 中缓存类,但使用 Qt 是在幕后。是否有其他地方可以在主线程而不是 qt 线程上缓存类 ID?
【问题讨论】:
-
问题解决了吗?
-
对于这个问题,我想我最终将 JNI_onLoad 添加到我的一个 .cpp 文件并在那里找到类 ID
-
是的,这主要是要走的路。添加答案或删除问题。谢谢。
标签: android qt qtquick2 qandroidjniobject