19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* //device/libs/android_runtime/android_os_Power.cpp 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2006, The Android Open Source Project 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** you may not use this file except in compliance with the License. 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** You may obtain a copy of the License at 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** See the License for the specific language governing permissions and 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License. 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/ 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "JNIHelp.h" 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h" 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "android_runtime/AndroidRuntime.h" 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/misc.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <hardware_legacy/power.h> 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/reboot.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void throw_NullPointerException(JNIEnv *env, const char* msg) 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass("java/lang/NullPointerException"); 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ThrowNew(clazz, msg); 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectacquireWakeLock(JNIEnv *env, jobject clazz, jint lock, jstring idObj) 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (idObj == NULL) { 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw_NullPointerException(env, "id is null"); 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *id = env->GetStringUTFChars(idObj, NULL); 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project acquire_wake_lock(lock, id); 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(idObj, id); 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectreleaseWakeLock(JNIEnv *env, jobject clazz, jstring idObj) 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (idObj == NULL) { 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw_NullPointerException(env, "id is null"); 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *id = env->GetStringUTFChars(idObj, NULL); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project release_wake_lock(id); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(idObj, id); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectsetLastUserActivityTimeout(JNIEnv *env, jobject clazz, jlong timeMS) 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return set_last_user_activity_timeout(timeMS/1000); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectsetScreenState(JNIEnv *env, jobject clazz, jboolean on) 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return set_screen_state(on); 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Power_shutdown(JNIEnv *env, jobject clazz) 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sync(); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_ANDROID_OS 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reboot(RB_POWER_OFF); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Power_reboot(JNIEnv *env, jobject clazz, jstring reason) 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sync(); 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_ANDROID_OS 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (reason == NULL) { 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reboot(RB_AUTOBOOT); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *chars = env->GetStringUTFChars(reason, NULL); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LINUX_REBOOT_CMD_RESTART2, (char*) chars); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(reason, chars); // In case it fails. 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowIOException(env, errno); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod method_table[] = { 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "acquireWakeLock", "(ILjava/lang/String;)V", (void*)acquireWakeLock }, 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "releaseWakeLock", "(Ljava/lang/String;)V", (void*)releaseWakeLock }, 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "setLastUserActivityTimeout", "(J)I", (void*)setLastUserActivityTimeout }, 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "setScreenState", "(Z)I", (void*)setScreenState }, 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "shutdown", "()V", (void*)android_os_Power_shutdown }, 1087ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat { "rebootNative", "(Ljava/lang/String;)V", (void*)android_os_Power_reboot }, 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_os_Power(JNIEnv *env) 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods( 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env, "android/os/Power", 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method_table, NELEM(method_table)); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 119