2016-12-28 2 views
0

Я использую 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?

+0

Вы решили проблему? – BaCaRoZzo

+0

По этой проблеме, я думаю, что в итоге я добавил JNI_onLoad в один из моих .cpp-файлов и обнаружил там идентификатор класса – ryan0270

+0

Да, это в основном путь. Либо добавьте ответ, либо удалите вопрос. Благодарю. – BaCaRoZzo

ответ

0

Чтобы ответить на мой собственный вопрос для полноты ...

Причина, по которой не удалось найти классы были Qt работает в другом потоке, чем основной Java нить, которая вызвала Java-загрузчик классов, чтобы потерпеть неудачу в поиска (см. ссылку в вопросе обновления).

В качестве решения я добавил функцию JNI_onLoad в один из моих файлов cpp, который вызывается в основном потоке java, поэтому поиск в классе работает правильно.

Смежные вопросы