您的位置:首页 > 移动开发 > Android开发

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

2015-07-29 12:00 531 查看

基本介绍:

从以前的博客中提到,我们,最后,通过关机过程变化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 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: