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をキャッシュすることができる他の場所はありますか?
問題を解決しましたか? – BaCaRoZzo
この問題に対して、私は自分の.cppファイルの1つにJNI_onLoadを追加してそこにクラスIDを見つけることになったと思う。 – ryan0270
それはほとんどの方法だ。回答を追加するか、質問を削除してください。ありがとう。 – BaCaRoZzo