简介:

从之前的博文中我们提到过,关机流程中最后是通过修改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. 我需要在Web上完成一个图片上传的功能(+2)

    增加一个页面,用于判断传参是否正确. @{     //判断是否具备会员参数     if (UrlData.Count > 0)     {         Session["Arg ...

  2. Java开发工具安装步骤内容如下

    Java开发工具安装步骤内容如下 安装 开发工具 STS 链接下载网址 eclipse 链接下载网址 JDK安装 jdk链接下载地址 Marven环境 marven链接下载地址 Tomcat tomc ...

  3. 在Oracle中使用Entity Framework 6 CodeFirst

    项目中需要将系统从SQLServer数据库迁移到Oracle上.由于原大部分数据访问操作都是通过包装了Entity Framework的统一访问入口实现的,所以需要研究Entity Framework ...

  4. 高手总结的“恋爱法”学习Linux系统,效果更好。

    如果你恋爱了,那你一定非常喜欢她.了解她,知道她喜欢吃什么玩什么,知道她需要什么,在她生气的时候可以哄她开心,一切尽在你的手指中.那你想学好Linux吗?喜欢Linux吗?你懂她吗?你有喜欢Linux ...

  5. Android Token的使用学习

    学习Token Token是什么? Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Tok ...

  6. Android 中的常用方法

    //安装apk文件 private void installAPK(File file) {  Intent intent = newIntent(Intent.ACTION_VIEW);  Uri ...

  7. 移动端flex布局 微信和UC的兼容性

    请查看以下两个链接 http://www.tuicool.com/articles/Afq6Bzq http://www.sheng00.com/2148.html

  8. SpringMVC 表单标签 & 处理静态资源

    使用 Spring 的表单标签 通过 SpringMVC 的表单标签可以实现将模型数据中的属性和 HTML 表单元素相绑定,以实现表单数据更便捷编辑和表单值的回显. form 标签 一般情况下,通过 ...

  9. Android studio打开之后 cannot load project: java.lang.NUllpointerException

    参考来源:http://bbs.csdn.net/topics/391014393 关闭网络,重新打开Android studio就好了.(但是原因不清楚是为什么?) Internal error.  ...

  10. Apache MiNa 实现多人聊天室

    Apache MiNa 实现多人聊天室 开发环境: System:Windows JavaSDK:1.6 IDE:eclipse.MyEclipse 6.6 开发依赖库: Jdk1.4+.mina-c ...