变化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 }
相关文章推荐
- android系统如何获得外置卡路径
- Android之项目推荐使用的第三方库
- Android开发之adb命令
- Android:Layout_weight的深刻理解
- android 字符串string
- (转)Android新的menu实现——ActionMode
- android 休眠唤醒机制分析(一)----wake_lock (自用 学习记录)
- android项目引入三方类库配置文件
- robotium+ant+android-junit-report
- Android之TelephonyManager类的方法详解
- Android4.0系统接收不到广播的问题解析
- Android 获取手机IMEI方法
- Android中的复制粘贴
- android javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
- Robotium in Android Studio
- iOS- iOS 和 Android 的后台推送原理各是什么?有什么区别?
- Android开源库
- android keyEvent
- 安卓开发环境搭建
- Android自定义宽高动画