Russian Qt Forum
Ноябрь 23, 2024, 00:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt5.2 + Android + JNI вызов (на примере vibrator)  (Прочитано 9052 раз)
andrek
Гость
« : Декабрь 16, 2013, 11:40 »

Сам java класс vibrator описан здесь http://developer.android.com/reference/android/os/Vibrator.html
Я целый день перелопатил гугль, вот сконструировал рабочий пример (думаю 100% кому нибудь пригодиться, день съэкономите):

Код:
#include <QAndroidJniObject>
#include <QAndroidJniEnvironment>
#include <jni.h>
#include <qpa/qplatformnativeinterface.h>

QPlatformNativeInterface* interface = QApplication::platformNativeInterface();
jobject objActivity = (jobject) interface->nativeResourceForIntegration("QtActivity");
    
QAndroidJniEnvironment jniEnv;
jclass classActivity = jniEnv->FindClass("android/app/Activity");
jmethodID mSystemService = jniEnv->GetMethodID(classActivity, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;");

jstring strMethod = jniEnv->NewStringUTF("vibrator");
jobject objVibrator = jniEnv->CallObjectMethod(objActivity, mSystemService, strMethod);
    
jclass classVibrator = jniEnv->GetObjectClass(objVibrator);
jmethodID mVibrate = jniEnv->GetMethodID(classVibrator, "vibrate", "(J)V");

jlong msDuration = 100;
jniEnv->CallVoidMethod(objVibrator, mVibrate, msDuration);

В 5.2 появился новый класс QAndroidJniObject, как бы мне этот пример уменьшить с помощью QAndroidJniObject (для чего то его добавили же)?
« Последнее редактирование: Декабрь 16, 2013, 11:45 от andrek » Записан
carrygun
Гость
« Ответ #1 : Декабрь 16, 2013, 12:23 »

Я слегка оффтопну, но вот Вы, как человек, пишущий под Андроид, не могли бы сказать, можно ли в 5.2 получить *.apk адекватным способом? Деплоить запуском на устройство уж очень не нравится, я думал что в 5.2 это исправят, но толи ничего не сделали, толи я чего не нашел.
Записан
silverrulezz
Гость
« Ответ #2 : Декабрь 16, 2013, 12:47 »

Цитировать
как бы мне этот пример уменьшить с помощью QAndroidJniObject
Есть пример работы с Qt Android Extras http://doc-snapshot.qt-project.org/qt5-stable/qtandroidextras-notification-example.html
По аналогии добавляем новый метод в NotificationClient.java:
Код:
static void vibrate(int ms)
{
    Vibrator vibrator = (Vibrator)NotificationClient.m_instance.getApplicationContext().getSystemService(Context.VIBRATOR_SERVICE);
    vibrator.vibrate(ms);
}

Из Си вызываем таким вот способом:
Код:
QAndroidJniObject::callStaticObjectMethod("org/qtproject/example/notification/NotificationClient", "vibrate", "(I)V", 500);

Цитировать
можно ли в 5.2 получить *.apk адекватным способом?
Тоже интересует данный вопрос Улыбающийся
Записан
andrek
Гость
« Ответ #3 : Декабрь 16, 2013, 14:42 »

спасибо, вроде то что нужно. потестирую.
наcчет APK, встраивать это в qt creator не разумно, т.к. креатор не должен быть привязан к определенной архитектуре, а APK это только для Android. Но как вариант можно собирать скриптом, в папке android-build через ndk-build + ant
Записан
andrek
Гость
« Ответ #4 : Декабрь 17, 2013, 02:43 »

К сожалению этот пример у меня не заработал, NullPointerException на Context.NOTIFICATION_SERVICE
подобное описано уже здесь:
http://stackoverflow.com/questions/6207689/notification-from-intentservice-nullpointerexception-while-obtaining-context
Записан
silverrulezz
Гость
« Ответ #5 : Декабрь 17, 2013, 11:44 »

Я вижу тебе уже ответили на stackoverflow. Но есть и другой вариант. Необязательно писать это дело в onCreate. У тебя такая строка кода:
Код:
mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
А нужно написать:
Код:
mNotificationManager = (NotificationManager)m_instance.getSystemService(Context.NOTIFICATION_SERVICE);

И вот такой вот конструктор:
Код:
private static NotificationClient m_instance;
public NotificationClient()
{
    m_instance = this;
}

Контекст пожно получать таким вот образом:
Код:
m_instance.getApplicationContext()
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 21.