简介:

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

native_set()--->SystemProperties_set()

这是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),即将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 }




更多相关文章

  1. 关于那些Android中不常用的设置属性
  2. 横屏和竖屏切换界面不刷新
  3. Android(安卓)Property System | Android属性系统
  4. TextView 属性
  5. Android(安卓)Activity生命周期管理
  6. andriod EditText的属性[转]
  7. android:imeOptions属性
  8. Android应用程序启动过程源代码分析
  9. Android(安卓)控件系列: GridView 的简单使用

随机推荐

  1. 特斯拉AI团队招聘!马斯克:我不在乎学历,但编
  2. 激光雷达有哪些重要参数?
  3. Xhorse Key Tool Plus所有丢失的密钥添加
  4. 中断时间序列分析ITSA是什么? 很流行的政
  5. 趁火打劫!印度APT组织对我国医疗机构发起
  6. 用PowerShell通过Posh-SSH免密码自动登录
  7. 倡议: 你来推荐文献, 我来帮你解读, 让计
  8. 自动驾驶思考:硬件篇
  9. 推荐系统:石器与青铜时代
  10. 回放:如何构建高效能的地图定位系统