Я использую Qt (qml), чтобы сделать приложение для Android, но я получаю ошибки, пытаясь зарегистрировать собственные методы для вызова из java. В одном из разделов на моем родном коде я звоню Java статические функции без проблем:qt android ClassNotFoundException
void NotificationClient::powerOff() {
QAndroidJniObject::callStaticMethod<void>("com/my_app/Utils",
"powerOff",
"()V"
);
}
Теперь я пытаюсь добавить некоторые звонки из Явы обратно в мой родной код (на основе 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]]
Я проверил dexdump от classes.dex и строковых класса спичек. Все пути в моем AndroidManifest.xml являются абсолютными. Я убрал и перестроил. Ничего не происходит вокруг этой проблемы, и я не могу понять, почему работает вызов статического метода, но объекта нет.
(Да, еще одно сообщение ClassNotFoundException, но я действительно искал ответы уже).
редактировать оригинальный удалось метод, основанный на создании объекта бросил другую ошибку, так что я перешел обратно использовать FindClass, который дает ошибку ClassNotFound
UPDATE ОК, так что я думаю, что я понял, почему FindClass не работает: согласно this FindClass выполнит поиск в callstack, чтобы выяснить, какой ClassLoader использовать. Обычно это нормально, но я считаю, что Qt для Android-андроидов под другим потоком, так что вызывает вызов неправильного ClassLoader.
Ссылка рекомендует кэшировать классы в JNI_onLoad, но с Qt это за кулисами. Есть ли другое место, где я мог бы кэшировать идентификаторы класса в основном потоке вместо потока qt?
Вы решили проблему? – BaCaRoZzo
По этой проблеме, я думаю, что в итоге я добавил JNI_onLoad в один из моих .cpp-файлов и обнаружил там идентификатор класса – ryan0270
Да, это в основном путь. Либо добавьте ответ, либо удалите вопрос. Благодарю. – BaCaRoZzo