我正在使用Qt(qml)來製作一個android應用程序,但我收到了錯誤,試圖註冊從java調用的本地方法。在我的本機代碼的一個部分,我將Java靜態功能,沒有任何問題:qt android ClassNotFoundException
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後,但我真的已經搜索了答案)。
編輯基礎上創建的對象的原始未能方法拋出不同的錯誤,所以我切換回使用的findClass這給ClassNotFound的錯誤
UPDATE 好了,我想我已經想通了爲什麼FindClass失敗:根據this FindClass將搜索callstack來確定要使用哪個ClassLoader。通常這很好,但我相信Qt會在不同的線程下加載android,所以錯誤的ClassLoader會被調用。
鏈接建議在JNI_onLoad中緩存類,但是在後臺使用Qt。有沒有其他的地方可以在主線程上緩存class id而不是qt線程?
你解決了這個問題嗎? – BaCaRoZzo
對於這個問題,我想我最終添加了一個JNI_onLoad到我的.cpp文件之一,並找到那裏的類ID – ryan0270
是的,這主要是要走的路。請添加答案或刪除問題。謝謝。 – BaCaRoZzo