无法使用 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&lt;void&gt;("release", "()V"); 而不是wakeLock.callMethod&lt;void&gt;("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

操作 QAndroidJniObject 数组

无法使用 Qt for Android 使手机播放声音或振动

使用字符串参数调用 AndroidJni 静态方法