无法使用 QAndroidJniObject 调用 PowerManager.WakeLock.newWakeLock
Posted
技术标签:
【中文标题】无法使用 QAndroidJniObject 调用 PowerManager.WakeLock.newWakeLock【英文标题】:Unable to call PowerManager.WakeLock.newWakeLock using QAndroidJniObject 【发布时间】:2015-12-07 10:33:33 【问题描述】:我正在尝试执行这段 Java 代码:
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
wl.acquire();
使用 Qt QandroidJniObject(我正在 Android 上部署 Qt 应用程序)。
我做到了:
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" );
QAndroidJniObject wakeLock = powerMgr.callObjectMethod("newWakeLock", "(ILjava/lang/String;)Landroid/os/PowerManager/WakeLock;", levelAndFlags,tag.object<jstring>());
if ( wakeLock.isValid() )
wakeLock.callMethod<void>("acquire", "()V");
else
assert( false );
从调试器检查:levelAndFlags
正确 (6),tag
正确(“我的标签”),但 wakeLock.isValid()
返回 false。
这行肯定有问题:
QAndroidJniObject wakeLock = powerMgr.callObjectMethod("newWakeLock", "(ILjava/lang/String;)Landroid/os/PowerManager/WakeLock;", levelAndFlags,tag.object<jstring>());
但我不知道是什么......
【问题讨论】:
锁被获取后如何释放? @Paul: 打电话给m_wakeLock.callMethod<void>("release", "()V");
而不是wakeLock.callMethod<void>("acquire", "()V");
【参考方案1】:
嵌套类名需要特殊语法:
Landroid/os/PowerManager/WakeLock
应该是:
Landroid/os/PowerManager$WakeLock
而且它有效!
【讨论】:
以上是关于无法使用 QAndroidJniObject 调用 PowerManager.WakeLock.newWakeLock的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 QAndroidJniObject 从 Java 调用 Intent
QAndroidJniObject::callMethod() 和 QAndroidJniObject::callObjectMethod() 有啥区别?
Qt 和 Android Gallery - 使用 QAndroidJniObject 的 MediaStore