2016-12-28 3 views
0

Androidアプリを作るのにQt(qml)を使用していますが、Javaから呼び出すネイティブメソッドを登録しようとするとエラーが発生します。qtアンドロイドClassNotFoundException

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

は、今私はJavaから戻って(this exampleに基づいて)私のネイティブコードにいくつかの呼び出しを追加しようとしているが、それは

を失敗します。私のネイティブコードの1つのセクションでは、私は何の問題もなくJavaの静的関数を呼んでいます
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投稿がありますが、実際にはすでに回答が検索されています)。私はにClassNotFoundエラーに

UPDATE OKを与えるFindClassがを使用するようにスイッチバックしてオブジェクトを作成するに基づいて

編集オリジナル失敗したメソッドは、別のエラーを投げたので、私は、私は考え出したと思いますFindClassが失敗している理由:thisに従うFindClassは、呼び出しスタックを検索して、使用するClassLoaderを特定します。通常これは問題ありませんが、間違ったClassLoaderが呼び出されるように、別のスレッドでアンドロイドが読み込まれているとQtは信じています。

リンクでは、JNI_onLoadのクラスをキャッシングすることをお勧めしますが、背後にあるQtを使用することをお勧めします。 Qtスレッドの代わりにメインスレッドにクラスIDをキャッシュすることができる他の場所はありますか?

+0

問題を解決しましたか? – BaCaRoZzo

+0

この問題に対して、私は自分の.cppファイルの1つにJNI_onLoadを追加してそこにクラスIDを見つけることになったと思う。 – ryan0270

+0

それはほとんどの方法だ。回答を追加するか、質問を削除してください。ありがとう。 – BaCaRoZzo

答えて

0

完全性について自分の質問に答えるために...

それがクラスを見つけることができなかった理由は、Qtが(Javaクラスローダーは、ルックアップに失敗する原因メインのJavaスレッドとは異なるスレッド上で実行されましたリンクの質問の更新を参照してください)。

解決策として、メインJavaスレッドで呼び出されるcppファイルの1つにJNI_onLoad関数を追加して、クラスルックアップが正しく機能するようにしました。

関連する問題