2013-07-15 132 views
1

我試着在我的android手機上獲取喚醒鎖,但是我無法通過NDK/JNI在c/cpp中找到任何信息。
我一直googlin這麼久,我看不到直。我所看到的只是Java Java Java,而我需要一些C,少量的C會幫助我。 :)有沒有辦法通過JNI/NDK獲取android上的wakelock?

有沒有人知道我在哪裏可以找到一小部分C,在Android設備上實現喚醒鎖定?

爲什麼我需要它......我創建一個lib來完成一個非常具體的任務,並且我想包含wakelock作爲該lib的一部分。保持需要在一起的東西,而不是在我不需要的地方混合我的代碼。

+0

我不知道通過NDK支持獲取或釋放WakeLock的方式。 – CommonsWare

+0

kewl ..爲什麼評論你缺乏知識? – MollyCat

+1

在StackOverflow上,很多問題都被問到,並且沒有答案。對於像你這樣的問題(「告訴我如何去做X」),提問的人不知道是否缺少答案意味着沒有辦法做X,或者沒有人知道提供了答案。在其中一些情況下,我會發表評論,表明我認爲答案是「沒有辦法做X」,如果你沒有得到任何實際的答案,所以你有辦法解釋沉默。如果我*積極* X不能完成,我會將其作爲答案發布。 – CommonsWare

回答

0

如果您願意,您絕對可以在C中完成所有工作。但要正確獲取喚醒鎖,至少需要ApplicationContext。這意味着您的natvie代碼仍將依賴於Java級別的合作,如NativeActivity。

您將簡單地使用JNI來查找必要的類和方法ID。

+0

你的意思是我的c必須調用java函數嗎?這似乎無意義。我的意思是,如果我把Java調用放在我的lib中,它會堅持實現隱藏,但是Uggh ..它對我來說味道很腥。必須有一種方法。 – MollyCat

+0

您是否找到更好的解決方案? – JMR

-1

這隻能使用JNI來完成,因爲dex引擎處理喚醒鎖控制。有一點的代碼張貼忽略了所有的錯誤檢查和異常處理在這裏:http://irrlicht.sourceforge.net/forum/viewtopic.php?f=9&t=50228 (無恥地複製&粘貼的谷歌閱讀器如果鏈接曾經打破)

// constructing the lock 
JNIEnv* jni = 0; 
Context->App->activity->vm->AttachCurrentThread(&jni, NULL); 
if (jni) 
{ 
    jclass classNativeActivity = jni->FindClass("android/app/NativeActivity"); 
    jclass classPowerManager = jni->FindClass("android/os/PowerManager"); 
    if (classPowerManager) 
    { 
     jmethodID idNativeActivity_getAppContext = jni->GetMethodID(classNativeActivity, "getApplicationContext", "()Landroid/content/Context;"); 

     jobject AppContext = jni->CallObjectMethod(Context->App->activity->clazz, idNativeActivity_getAppContext); 
     if (AppContext) 
     { 
      jmethodID idNativeActivity_getSystemService = jni->GetMethodID(classNativeActivity, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;"); 
      jstring POWER_SERVICE = jni->NewStringUTF("power"); 
      jobject PowerManager = jni->CallObjectMethod(AppContext, idNativeActivity_getSystemService, POWER_SERVICE); 
      if (PowerManager) 
      { 
       jmethodID idPowerManager_newWakeLock = jni->GetMethodID(classPowerManager, "newWakeLock", "(ILjava/lang/String;)Landroid/os/PowerManager$WakeLock;"); 
       int SCREEN_BRIGHT_WAKE_LOCK = 0x0000000a; 
       long int ON_AFTER_RELEASE = 0x20000000; 
       jstring jWakeLockTag = jni->NewStringUTF("com.entity.Polygame.MY_BRIGHT_SCREEN_LOCK_LOL"); 

       WakeLock = jni->CallObjectMethod(PowerManager, idPowerManager_newWakeLock, SCREEN_BRIGHT_WAKE_LOCK | ON_AFTER_RELEASE, jWakeLockTag); 
       debugLog("constructed wake lock"); 

       jni->DeleteLocalRef(jWakeLockTag); 
      } 

      jni->DeleteLocalRef(POWER_SERVICE); 
     } 

    } 

    Context->App->activity->vm->DetachCurrentThread(); 
} 


// acquire/release (the lock is in "released" state when first constructed) 

JNIEnv* jni = 0; 
Context->App->activity->vm->AttachCurrentThread(&jni, NULL); 
if (jni) 
{ 
    jclass wakeLock = jni->FindClass("android/os/PowerManager$WakeLock"); 

    if (locked) to acquire the lock 
    { 
     jmethodID idWakeLock_acquire = jni->GetMethodID(wakeLock, "acquire", "()V"); 

     jni->CallVoidMethod(WakeLock, idWakeLock_acquire); 

     debugLog("acquired wake lock"); 
    } 
    else // release the lock 
    { 
     jmethodID idWakeLock_release = jni->GetMethodID(wakeLock, "release", "()V"); 

     jni->CallVoidMethod(WakeLock, idWakeLock_release); 

     debugLog("released wake lock"); 
    } 

    Context->App->activity->vm->DetachCurrentThread(); 
    Active = locked; 
} 
0

我認爲一個簡單的方法是做一些事情像這樣

system("echo 'mylock' > /sys/power/wake_lock"); 
+0

這需要root訪問權限。 – tmm1

相關問題