Using JNI



  • Hi,
    i want to do the following with Qt QAndroidJniObject:

    wakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "My Tag");
    

    The problem is that i can not do the pipe ( | ) with qt.
    My code is

    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>());
               }
           }
       }
    

    Anu help????


  • Qt Champions 2017

    Hi
    For me it looks like an binary OR of enum values. ( like setFlags)
    ( PowerManager.SCREEN_DIM_WAKE_LOCK OR'ED PowerManager.ACQUIRE_CAUSES_WAKEUP )
    But in java this mean some else?


  • Qt Champions 2017

    @mrjj said in Using JNI:

    Hi
    For me it looks like an binary OR of enum values. ( like setFlags)
    ( PowerManager.SCREEN_DIM_WAKE_LOCK OR'ED PowerManager.ACQUIRE_CAUSES_WAKEUP )
    But in java this mean some else?

    I think it's exactly the same in Java and C++



  • Could you please give a sample of code?
    I don't understand what exactly i have to do.


  • Qt Champions 2017

    Hi
    Syntax should be the same.
    https://www.somacon.com/p125.php
    For the OR part but are you talking about the actual pm.newWakeLock call or
    simply the
    PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP ?



  • If i use | this cause error. It says that there is not such flag.


  • Qt Champions 2017

    @NickV
    Hi
    can you show exact error ?
    Maybe it just dont know PowerManager.SCREEN_DIM_WAKE_LOCK etc.



  • java.lang.NoSuchFieldError: no "I" field "SCREEN_DIM_WAKE_LOCK|ACQUIRE_CAUSES_WAKEUP" in class "Landroid/os/PowerManager;" or its superclasses
    

  • Qt Champions 2017

    @NickV
    Oh, we read it all completely wrong.
    Its not in c++ , but java ?



  • I am using QAndroidJniObject in order to call power manager and set cpu flags. The code is the above code that i've posted. Look the initial post.


  • Qt Champions 2017

    @NickV
    Hi
    Seems like it dont know
    PowerManager.SCREEN_DIM_WAKE_LOCK
    Do you know where its normally defined ?



  • No. If i use only SCREEN_DIM_WAKE_LOCK no error produced. Look this link


  • Qt Champions 2017

    @NickV
    But it dont work without PowerManager.ACQUIRE_CAUSES_WAKEUP ?



  • No it works but i need this extra flag in order to do some work.


  • Qt Champions 2017

    @NickV
    But did u look where SCREEN_DIM_WAKE_LOCK is defined ?
    Does it define the ACQUIRE_CAUSES_WAKEUP at all ?
    maybe it was added in later version of the SDK.



  • Ok! Thanks for your response!


  • Moderators

    @NickV
    For me something is not clear, did you already try the following or not?!

    jint levelAndFlags = QAndroidJniObject::getStaticField<jint>("android/os/PowerManager","SCREEN_DIM_WAKE_LOCK") | QAndroidJniObject::getStaticField<jint>("android/os/PowerManager","ACQUIRE_CAUSES_WAKEUP");
    

Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.