简介:

从之前的博文中我们提到过,关机流程中最后是通过修改Android属性进行关机操作(SystemProperties.java通过JNI调用访问系统属性),当然我们也可以通过adb命令修改Android系统属性执行关机操作,例如adb shell setpro sys.powerctl shutdown,这里我们简单介绍下修改Android属性关机的原理或流程。

native_set()<SystemProperties.java>--->SystemProperties_set()<android_os_SystemProperties.cpp>

这是SystemProperties.java类中设置系统函数的方法。

0119     /**

0120      * Set the value for the given key.

0121      * @throws IllegalArgumentException if the key exceeds 32 characters

0122      * @throws IllegalArgumentException if the value exceeds 92 characters

0123      */

0124     public static void set(String key, String val) {

0125         if (key.length() > PROP_NAME_MAX) {

0126             throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX);

0127         }

0128         if (val != null && val.length() > PROP_VALUE_MAX) {

0129             throw new IllegalArgumentException("val.length > " +

0130                 PROP_VALUE_MAX);

0131         }

0132         native_set(key, val);//SystemProperties.java通过JNI调用访问系统属性

0133     }

SystemProperties接口类在初始环境中注册对应CPP接口android_os_SystemProperties.cpp,实际操作通过JNI调用对应cpp文件,frameworks/base/core/jni/AndroidRuntime.cpp.点击查看源码

extern int register_android_os_SystemProperties(JNIEnv *env);

frameworks/base/core/jni/android_os_SystemProperties.cpp;点击查看完整源码

0162 static void SystemProperties_set(JNIEnv *env, jobject clazz,

0163                                       jstring keyJ, jstring valJ)

0164 {

0165     int err;

0166     const char* key;

0167     const char* val;

0168 

0169     if (keyJ == NULL) {

0170         jniThrowNullPointerException(env, "key must not be null.");

0171         return ;

0172     }

0173     key = env->GetStringUTFChars(keyJ, NULL);

0174     *从java程序中传过去的String对象在本地方法中对应的是jstring类型,jstring类型和c中的char*不同,如果你直接作为char*使用的话,就会出错。因此使用之前需要进行转换。转换方式就是GetStringUTFChars(keyJ, NULL)<JNIenv方式>,即将jstring转换成UTF-8格式的char*。*/

0175     if (valJ == NULL) {

0176         val = "";       /* NULL pointer not allowed here */

0177     } else {

0178         val = env->GetStringUTFChars(valJ, NULL);

0179     }

0180 

0181     err = property_set(key, val);

0182 

0183     env->ReleaseStringUTFChars(keyJ, key);

0184     /*释放指向UTF-8格式的char*的指针*/

0185     if (valJ != NULL) {

0186         env->ReleaseStringUTFChars(valJ, val);

0187     }

0188 

0189     if (err < 0) {

0190         jniThrowException(env, "java/lang/RuntimeException",

0191                           "failed to set system property");

0192     }

0193 }

修改Android系统属性SystemProperties.set("sys.powerctl", "shutdown")关机分析的更多相关文章

  1. 变化Android系统属性SystemProperties.set(&quot;sys.powerctl&quot;, &quot;shutdown&quot;)关机分析

    基本介绍: 从以前的博客中提到,我们,最后,通过关机过程变化Android关机属性(SystemProperties.java由JNI呼叫接入系统属性),当然,我们也能adb命令变化Android系统 ...

  2. Android 系统属性-SystemProperties详解***

    创建与修改android属性用Systemproperties.set(name, value),获取android属性用Systemproperties.get(name),需要注意的是androi ...

  3. Android系统属性SystemProperties在应用层的用法【转】

    本文转载自:https://blog.csdn.net/lilidejing/article/details/53288243 如果你看到这篇文章了,说明你已经是资深程序员,会发现整个Android系 ...

  4. Android系统属性SystemProperties分析

    下面这几个博客总结的不错,有空看下: http://www.cnblogs.com/bastard/archive/2012/10/11/2720314.html http://blog.csdn.n ...

  5. Android 系统属性

    /************************************************************************ * Android 系统属性 * 说明: * 由于需 ...

  6. 修改Android系统字号(二)

    /*********************************************************************** * 修改Android系统字号(二) * 说明: * ...

  7. 修改Android系统字号(一)

    /*********************************************************************** * 修改Android系统字号(一) * 说明: * ...

  8. getprop 获取android系统属性

    Android属性系统 property_get/property_set  (很透彻)http://www.blogjava.net/MEYE/articles/359773.html getpro ...

  9. 修改android系统开机动画

    本文转载自:http://blog.csdn.net/u012301841/article/details/51598115 修改android系统开机动画

随机推荐

  1. 给libpcap增加一个新的捕包方法

    libpcap是一个网络数据包捕获函数库,功能非常强大,提供了系统独立的用户级别网络数据包捕获接口,Libpcap可以在绝大多数类unix 平台下工作.大多数网络监控软件都以它为基础,著名的tcpdu ...

  2. js获取当前日期的前一天、一月、一年的日期 明天、后天(转)

    function getYestoday(date){ var yesterday_milliseconds=date.getTime()-1000*60*60*24; var yesterday = ...

  3. MySQL全文检索

    参考一:http://www.cnblogs.com/feichexia/archive/2012/06/09/2543049.html

  4. C++中的const和指针组合

    在C++里,const修饰指针有以下三种情况 (1)指针常量:即指向常量的指针 const  int *p或者int const *p const在*前,,可以这样理解它的功能,因为const在*前, ...

  5. gulp教程之gulp-rev-append

    简介: 使用gulp-rev-append给页面的引用添加版本号,清除页面引用缓存. 1.安装nodejs/全局安装gulp/项目安装gulp/创建package.json和gulpfile.js文件 ...

  6. 在JSP中上传图片到数据库中

    第一步:建立数据库 create table test_img(id number(4),name varchar(20),img long raw); 第二步:(NewImg.html) <h ...

  7. java系统高并发解决方案-转

    转载博客地址:http://blog.csdn.net/zxl333/article/details/8685157 一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图 ...

  8. Objective-C( Foundation框架 一 NSDictionary (NSMutaleDictionary))

    NSDictionary 不可变的字典 创建字典的方法 // 创建字典的方式 NSDictionary *dy = [NSDictionary dictionaryWithObject:@" ...

  9. C# 利用占位符替换word中的字符串和添加图片

    利用占位符替换word中的字符串和添加图片   ///<summary>         /// 替换word模板文件内容,包括表格中内容         /// 调用如下:WordStr ...

  10. JS数组常用函数以及查找数组中是否有重复元素的三种常用方法

    阅读目录: DS01:常用的查找数组中是否有重复元素的三种方法 DS02:常用的JS函数集锦 DS01.常用的查找数组中是否有重复元素的三种方法  1. var ary = new Array(&qu ...