142 lines
3.7 KiB
C++
142 lines
3.7 KiB
C++
/* //device/libs/android_runtime/android_os_Power.cpp
|
|
**
|
|
** Copyright 2006, The Android Open Source Project
|
|
** Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
|
|
**
|
|
** Licensed under the Apache License, Version 2.0 (the "License");
|
|
** you may not use this file except in compliance with the License.
|
|
** You may obtain a copy of the License at
|
|
**
|
|
** http://www.apache.org/licenses/LICENSE-2.0
|
|
**
|
|
** Unless required by applicable law or agreed to in writing, software
|
|
** distributed under the License is distributed on an "AS IS" BASIS,
|
|
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
** See the License for the specific language governing permissions and
|
|
** limitations under the License.
|
|
*/
|
|
|
|
#include "JNIHelp.h"
|
|
#include "jni.h"
|
|
#include "android_runtime/AndroidRuntime.h"
|
|
#include <utils/misc.h>
|
|
#include <hardware_legacy/power.h>
|
|
#include <sys/reboot.h>
|
|
|
|
namespace android
|
|
{
|
|
|
|
static void throw_NullPointerException(JNIEnv *env, const char* msg)
|
|
{
|
|
jclass clazz;
|
|
clazz = env->FindClass("java/lang/NullPointerException");
|
|
env->ThrowNew(clazz, msg);
|
|
}
|
|
|
|
static void
|
|
acquireWakeLock(JNIEnv *env, jobject clazz, jint lock, jstring idObj)
|
|
{
|
|
if (idObj == NULL) {
|
|
throw_NullPointerException(env, "id is null");
|
|
return ;
|
|
}
|
|
|
|
const char *id = env->GetStringUTFChars(idObj, NULL);
|
|
|
|
acquire_wake_lock(lock, id);
|
|
|
|
env->ReleaseStringUTFChars(idObj, id);
|
|
}
|
|
|
|
static void
|
|
releaseWakeLock(JNIEnv *env, jobject clazz, jstring idObj)
|
|
{
|
|
if (idObj == NULL) {
|
|
throw_NullPointerException(env, "id is null");
|
|
return ;
|
|
}
|
|
|
|
const char *id = env->GetStringUTFChars(idObj, NULL);
|
|
|
|
release_wake_lock(id);
|
|
|
|
env->ReleaseStringUTFChars(idObj, id);
|
|
|
|
}
|
|
|
|
static void
|
|
acquireCpuWakeLock(JNIEnv *env, jobject clazz)
|
|
{
|
|
acquire_cpu_max_lock();
|
|
}
|
|
|
|
static void
|
|
releaseCpuWakeLock(JNIEnv *env, jobject clazz)
|
|
{
|
|
release_cpu_max_lock();
|
|
}
|
|
|
|
|
|
static int
|
|
setLastUserActivityTimeout(JNIEnv *env, jobject clazz, jlong timeMS)
|
|
{
|
|
return set_last_user_activity_timeout(timeMS/1000);
|
|
}
|
|
|
|
static int
|
|
setScreenState(JNIEnv *env, jobject clazz, jboolean on)
|
|
{
|
|
return set_screen_state(on);
|
|
}
|
|
|
|
static void android_os_Power_shutdown(JNIEnv *env, jobject clazz)
|
|
{
|
|
sync();
|
|
#ifdef HAVE_ANDROID_OS
|
|
reboot(RB_POWER_OFF);
|
|
#endif
|
|
}
|
|
|
|
static void android_os_Power_reboot(JNIEnv *env, jobject clazz, jstring reason)
|
|
{
|
|
sync();
|
|
#ifdef HAVE_ANDROID_OS
|
|
if (reason == NULL) {
|
|
reboot(RB_AUTOBOOT);
|
|
} else {
|
|
const char *chars = env->GetStringUTFChars(reason, NULL);
|
|
__reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,
|
|
LINUX_REBOOT_CMD_RESTART2, (char*) chars);
|
|
env->ReleaseStringUTFChars(reason, chars); // In case it fails.
|
|
}
|
|
jniThrowIOException(env, errno);
|
|
#endif
|
|
}
|
|
|
|
static int
|
|
SetUnstableMemoryState(JNIEnv *env, jobject clazz, jboolean on)
|
|
{
|
|
return set_unstable_memory_state(on);
|
|
}
|
|
|
|
static JNINativeMethod method_table[] = {
|
|
{ "acquireWakeLock", "(ILjava/lang/String;)V", (void*)acquireWakeLock },
|
|
{ "releaseWakeLock", "(Ljava/lang/String;)V", (void*)releaseWakeLock },
|
|
{ "acquireCpuWakeLock", "()V", (void*)acquireCpuWakeLock },
|
|
{ "releaseCpuWakeLock", "()V", (void*)releaseCpuWakeLock },
|
|
{ "setLastUserActivityTimeout", "(J)I", (void*)setLastUserActivityTimeout },
|
|
{ "setScreenState", "(Z)I", (void*)setScreenState },
|
|
{ "shutdown", "()V", (void*)android_os_Power_shutdown },
|
|
{ "rebootNative", "(Ljava/lang/String;)V", (void*)android_os_Power_reboot },
|
|
{ "SetUnstableMemoryState", "(Z)I", (void*)SetUnstableMemoryState},
|
|
};
|
|
|
|
int register_android_os_Power(JNIEnv *env)
|
|
{
|
|
return AndroidRuntime::registerNativeMethods(
|
|
env, "android/os/Power",
|
|
method_table, NELEM(method_table));
|
|
}
|
|
|
|
};
|