zoukankan      html  css  js  c++  java
  • 变化Android系统属性SystemProperties.set("sys.powerctl", "shutdown")关机分析

    基本介绍:

            从以前的博客中提到,我们,最后,通过关机过程变化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 }




    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    递归方法:对于树形结构的表,根据当前数据获取无限极的父级名称
    P
    A
    今年暑假不AC1
    J
    今年暑假不AC
    A
    *max_element函数和*min_element函数
    1199: 房间安排
    素数
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4685562.html
Copyright © 2011-2022 走看看