2016-12-28 34 views
0

我正在使用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線程?

+0

你解決了這個問題嗎? – BaCaRoZzo

+0

對於這個問題,我想我最終添加了一個JNI_onLoad到我的.cpp文件之一,並找到那裏的類ID – ryan0270

+0

是的,這主要是要走的路。請添加答案或刪除問題。謝謝。 – BaCaRoZzo

回答

0

回答我自己的問題,完整性...

它未能找到類的原因是Qt的不同的線程比主Java線程,這引起了Java類加載器在查找故障運行(看問題更新鏈接)。

作爲一個解決方案,我在我的一個cpp文件中添加了一個JNI_onLoad函數,它在主java線程上調用,以便類查找正常工作。

相關問題