QAndroidJniObject helps execute Java code from Qt. Writing this can be difficult and hard to understand what is wrong when it does not work ....
Here is the solution (wrapped in a helper class) to lock a PowerManager.WakeLock object:
LockHelper.h:
#pragma once #include <QAndroidJniObject> class KeepAwakeHelper { public: KeepAwakeHelper(); virtual ~KeepAwakeHelper(); private: QAndroidJniObject m_wakeLock; };
LockHelper.cpp:
#include "LockHelper.h" #include <QAndroidJniObject> #include <QDebug> #include "jni.h" KeepAwakeHelper::KeepAwakeHelper() { QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;"); if ( activity.isValid() ) { QAndroidJniObject serviceName = QAndroidJniObject::getStaticObjectField<jstring>("android/content/Context","POWER_SERVICE"); if ( serviceName.isValid() ) { QAndroidJniObject powerMgr = activity.callObjectMethod("getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;",serviceName.object<jobject>()); if ( powerMgr.isValid() ) { jint levelAndFlags = QAndroidJniObject::getStaticField<jint>("android/os/PowerManager","SCREEN_DIM_WAKE_LOCK"); QAndroidJniObject tag = QAndroidJniObject::fromString( "My Tag" ); m_wakeLock = powerMgr.callObjectMethod("newWakeLock", "(ILjava/lang/String;)Landroid/os/PowerManager$WakeLock;", levelAndFlags,tag.object<jstring>()); } } } if ( m_wakeLock.isValid() ) { m_wakeLock.callMethod<void>("acquire", "()V"); qDebug() << "Locked device, can't go to standby anymore"; } else { assert( false ); } } KeepAwakeHelper::~KeepAwakeHelper() { if ( m_wakeLock.isValid() ) { m_wakeLock.callMethod<void>("release", "()V"); qDebug() << "Unlocked device, can now go to standby"; } }
Then just do:
{ KeepAwakeHelper helper; // screen and CPU will stay awake during this section // lock will be released when helper object goes out of scope }
Note. To use this code, you must be sure that you have the WAKE_LOCK permission set in the manifest.
source share