2013-07-15 71 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

相关问题