1

我正在尝试在我的 android 手机上获得唤醒锁,但我找不到任何关于通过 NDK/JNI 在 c/cpp 中执行此操作的信息。
我一直在谷歌这么久,我不能直视。我所看到的只是 Java Java Java,我需要一些 C。一点点 C 就可以了。:)

有谁知道我在哪里可以找到在 android 设备上实现唤醒锁的一小部分 C?

为什么我需要它...我正在创建一个库来执行一项非常具体的任务,并且我想将唤醒锁作为该库的一部分。为了保持需要在一起的东西,而不是在我不需要的地方混合我的代码。

4

3 回答 3

1

我认为一个简单的方法是做这样的事情

system("echo 'mylock' > /sys/power/wake_lock");
于 2017-01-14T08:07:06.170 回答
0

如果您愿意,您绝对可以用 C 语言完成所有工作。但要正确获取唤醒锁,您至少需要 ApplicationContext。这意味着您的 natvie 代码仍将依赖于 Java 级别的协作,例如 NativeActivity。

您将简单地使用 JNI 来查找必要的类和方法 ID。

于 2013-07-15T15:28:57.263 回答
0

这只能使用 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;
}
于 2016-02-28T17:32:34.847 回答