Russian Qt Forum

Qt => Qt Embedded => Тема начата: andrek от Декабрь 16, 2013, 11:40



Название: Qt5.2 + Android + JNI вызов (на примере vibrator)
Отправлено: andrek от Декабрь 16, 2013, 11:40
Сам java класс vibrator описан здесь http://developer.android.com/reference/android/os/Vibrator.html (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 (для чего то его добавили же)?


Название: Re: Qt5.2 + Android + JNI вызов (на примере vibrator)
Отправлено: carrygun от Декабрь 16, 2013, 12:23
Я слегка оффтопну, но вот Вы, как человек, пишущий под Андроид, не могли бы сказать, можно ли в 5.2 получить *.apk адекватным способом? Деплоить запуском на устройство уж очень не нравится, я думал что в 5.2 это исправят, но толи ничего не сделали, толи я чего не нашел.


Название: Re: Qt5.2 + Android + JNI вызов (на примере vibrator)
Отправлено: silverrulezz от Декабрь 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 адекватным способом?
Тоже интересует данный вопрос :)


Название: Re: Qt5.2 + Android + JNI вызов (на примере vibrator)
Отправлено: andrek от Декабрь 16, 2013, 14:42
спасибо, вроде то что нужно. потестирую.
наcчет APK, встраивать это в qt creator не разумно, т.к. креатор не должен быть привязан к определенной архитектуре, а APK это только для Android. Но как вариант можно собирать скриптом, в папке android-build через ndk-build + ant


Название: Re: Qt5.2 + Android + JNI вызов (на примере vibrator)
Отправлено: andrek от Декабрь 17, 2013, 02:43
Есть пример работы с Qt Android Extras http://doc-snapshot.qt-project.org/qt5-stable/qtandroidextras-notification-example.html
К сожалению этот пример у меня не заработал, NullPointerException на Context.NOTIFICATION_SERVICE
подобное описано уже здесь:
http://stackoverflow.com/questions/6207689/notification-from-intentservice-nullpointerexception-while-obtaining-context (http://stackoverflow.com/questions/6207689/notification-from-intentservice-nullpointerexception-while-obtaining-context)


Название: Re: Qt5.2 + Android + JNI вызов (на примере vibrator)
Отправлено: silverrulezz от Декабрь 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()