/*******************************************************************************
* I.MX6 Android frameworks services 文件架构
* 说明:
* 这部分内容后续可能需要多给一点注意力了,因为这部分在做系统移植的时候经常
* 需要通过这部分来进行调试。
* 2016-3-19 深圳 南山平山村 曾剑锋
******************************************************************************/ 一、cat frameworks/base/services/jni/Android.mk
# 获取当前路径
LOCAL_PATH:= $(call my-dir)
# 清理变量,但是不会清理LOCAL_PATH变量的值
include $(CLEAR_VARS) # 指定jni cpp文件
LOCAL_SRC_FILES:= \
com_android_server_AlarmManagerService.cpp \
com_android_server_BatteryService.cpp \
com_android_server_input_InputApplicationHandle.cpp \
com_android_server_input_InputManagerService.cpp \
com_android_server_input_InputWindowHandle.cpp \
com_android_server_LightsService.cpp \
com_android_server_power_PowerManagerService.cpp \
com_android_server_SerialService.cpp \
com_android_server_SystemServer.cpp \
com_android_server_UsbDeviceManager.cpp \
com_android_server_UsbHostManager.cpp \
com_android_server_VibratorService.cpp \
com_android_server_location_GpsLocationProvider.cpp \
com_android_server_connectivity_Vpn.cpp \
onload.cpp -----------------------------+
|
# 指定jni cpp依赖的头文件 |
LOCAL_C_INCLUDES += \ |
$(JNI_H_INCLUDE) \ |
frameworks/base/services \ |
frameworks/base/core/jni \ |
external/skia/include/core \ |
libcore/include \ |
libcore/include/libsuspend \ |
$(call include-path-for, libhardware)/hardware \ |
$(call include-path-for, libhardware_legacy)/hardware_legacy \ |
|
# 指定依赖的库文件 |
LOCAL_SHARED_LIBRARIES := \ |
libandroid_runtime \ |
libandroidfw \ |
libcutils \ |
libhardware \ |
libhardware_legacy \ |
libnativehelper \ |
libsystem_server \ |
libutils \ |
libui \ |
libinput \ |
libskia \ |
libgui \ |
libusbhost \ |
libsuspend |
|
ifeq ($(WITH_MALLOC_LEAK_CHECK),true) |
LOCAL_CFLAGS += -DMALLOC_LEAK_CHECK |
endif |
|
# 生成的模块的名字 |
LOCAL_MODULE:= libandroid_servers |
|
# 这里相当于开始编译 |
include $(BUILD_SHARED_LIBRARY) |
|
二、cat frameworks/base/services/jni/onload.cpp <--------------+
/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/ #include "JNIHelp.h"
#include "jni.h"
#include "utils/Log.h"
#include "utils/misc.h" // 声明接下来的需要用到android命名空间中的jni函数
namespace android {
int register_android_server_AlarmManagerService(JNIEnv* env);
int register_android_server_BatteryService(JNIEnv* env);
int register_android_server_InputApplicationHandle(JNIEnv* env);
int register_android_server_InputWindowHandle(JNIEnv* env);
int register_android_server_InputManager(JNIEnv* env);
int register_android_server_LightsService(JNIEnv* env);
int register_android_server_PowerManagerService(JNIEnv* env);
int register_android_server_SerialService(JNIEnv* env);
int register_android_server_UsbDeviceManager(JNIEnv* env);
int register_android_server_UsbHostManager(JNIEnv* env);
int register_android_server_VibratorService(JNIEnv* env);
int register_android_server_SystemServer(JNIEnv* env);
int register_android_server_location_GpsLocationProvider(JNIEnv* env);
int register_android_server_connectivity_Vpn(JNIEnv* env);
}; // 使用命名空间
using namespace android; // C语言JNI加载函数,用于调用前面的android命名空间总的函数,这些函数
// 主要是对JNI进行注册。
extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
JNIEnv* env = NULL;
jint result = -; if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
ALOGE("GetEnv failed!");
return result;
}
ALOG_ASSERT(env, "Could not retrieve the env!"); register_android_server_PowerManagerService(env); ---------------+
register_android_server_SerialService(env); |
register_android_server_InputApplicationHandle(env); |
register_android_server_InputWindowHandle(env); |
register_android_server_InputManager(env); |
register_android_server_LightsService(env); |
register_android_server_AlarmManagerService(env); |
register_android_server_BatteryService(env); |
register_android_server_UsbDeviceManager(env); |
register_android_server_UsbHostManager(env); |
register_android_server_VibratorService(env); |
register_android_server_SystemServer(env); |
register_android_server_location_GpsLocationProvider(env); |
register_android_server_connectivity_Vpn(env); |
+-------------------------+
return JNI_VERSION_1_4; | 间接加载
} |
v
三、cat frameworks/base/services/jni/com_android_server_BatteryService.cpp
......
namespace android { #define POWER_SUPPLY_PATH "/sys/class/power_supply" static void android_server_BatteryService_update(JNIEnv* env, jobject obj)
{
setBooleanField(env, obj, gPaths.acOnlinePath, gFieldIds.mAcOnline);
setBooleanField(env, obj, gPaths.usbOnlinePath, gFieldIds.mUsbOnline);
setBooleanField(env, obj, gPaths.wirelessOnlinePath, gFieldIds.mWirelessOnline);
setBooleanField(env, obj, gPaths.batteryPresentPath, gFieldIds.mBatteryPresent); setIntField(env, obj, gPaths.batteryCapacityPath, gFieldIds.mBatteryLevel);
setVoltageField(env, obj, gPaths.batteryVoltagePath, gFieldIds.mBatteryVoltage);
setIntField(env, obj, gPaths.batteryTemperaturePath, gFieldIds.mBatteryTemperature); char prop[];
// always report AC plug-in and capacity 100% if emulated.battery is set to 1
property_get("sys.emulated.battery", prop, "");
if (!strcmp(prop, "")){
env->SetBooleanField(obj, gFieldIds.mAcOnline, true);
env->SetIntField(obj, gFieldIds.mBatteryLevel, );
} const int SIZE = ;
char buf[SIZE]; if (readFromFile(gPaths.batteryStatusPath, buf, SIZE) > )
env->SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));
else
env->SetIntField(obj, gFieldIds.mBatteryStatus,
gConstants.statusUnknown); if (readFromFile(gPaths.batteryHealthPath, buf, SIZE) > )
env->SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf)); if (readFromFile(gPaths.batteryTechnologyPath, buf, SIZE) > )
env->SetObjectField(obj, gFieldIds.mBatteryTechnology, env->NewStringUTF(buf));
} static JNINativeMethod sMethods[] = {
/* name, signature, funcPtr */
{"native_update", "()V", (void*)android_server_BatteryService_update},
}; int register_android_server_BatteryService(JNIEnv* env)
{
......
return jniRegisterNativeMethods(env, "com/android/server/BatteryService", sMethods, NELEM(sMethods));
} |
|
} /* namespace android */ |
V
四、cat frameworks/base/services/java/com/android/server/BatteryService.java
......
public final class BatteryService extends Binder { ......
private native void native_update(); ......
private void updateLocked() {
if (!mUpdatesStopped) {
// Update the values of mAcOnline, et. all.
native_update(); // Process the new values.
processValuesLocked();
}
}
......
}

I.MX6 Android frameworks services 文件架构的更多相关文章

  1. I.MX6 Android USB Touch eGTouchA.ini文件存放

    /******************************************************************** * I.MX6 Android USB Touch eGTo ...

  2. I.MX6 android 禁止低电量自动关机

    /************************************************************************ * I.MX6 android 禁止低电量自动关机 ...

  3. Android群英传》读书笔记 (1) 第一章 Android体系与系统架构 + 第二章 Android开发工具新接触

    第一章 Android体系与系统架构 1.Dalvik 和 ARTDalvik好比是一辆可折叠的自行车,平时是折叠的,只有骑的时候,才需要组装起来用.ART好比是一辆组装好了的自行车,装好就可以骑了. ...

  4. Android App的设计架构:MVC,MVP,MVVM与架构经验谈

    相关:http://www.cnblogs.com/wytiger/p/5996876.html 和MVC框架模式一样,Model模型处理数据代码不变在Android的App开发中,很多人经常会头疼于 ...

  5. I.MX6 Android 5.1 快速合成系统

    /**************************************************************************** * I.MX6 Android 5.1 快速 ...

  6. I.MX6 Android netperf

    /***************************************************************************** * I.MX6 Android netpe ...

  7. I.MX6 Android U-blox miniPCI 4G porting

    /************************************************************************** * I.MX6 Android U-blox m ...

  8. I.MX6 android 设置 默认 动态桌面

    /************************************************************************ * I.MX6 android 设置 默认 动态桌面 ...

  9. I.MX6 Android iperf3 porting failed

    /***************************************************************************** * I.MX6 Android iperf ...

随机推荐

  1. xml学习总结(一)

    xml DTD 定义元素<!ELEMENT 元素名 元素类型描述 > (1)元素类型描述:任意类型,字符串型,空元素,包含子元素,混合类型 任意类型: <?xml version=& ...

  2. Python生成验证码

    #!/usr/bin/env python #coding:utf8 import random #方法1: str_code='zxcvbnmasdfghjklqwertyuiopZXCVBNMAS ...

  3. 阿里云服务器无法远程其他的mysql服务器

    1.初始化root密码 进入mysql数据库 1 mysql>update user set password=PASSWORD('123456') where User='root'; 2.允 ...

  4. Nginx简单性能调优

    Nginx默认没有开启利用多核CPU (忍不住吐槽,然怪总感觉服务器性能没充分发挥), 我们可以通过增加worker_cpu_affinity配置参数来充分利用多核CPU.CPU是任务处理,计算最关键 ...

  5. Java类加载器加载类顺序

    java ClassLoader的学习 java是一门解释执行的语言,由开发人员编写好的java源文件先编译成字节码文件.class形式,然后由java虚拟机(JVM)解释执 行,.class字节码文 ...

  6. 【NHibernate】配置- sql打印

    <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property> <pr ...

  7. EXTJS4.2 控件之Grid 根据数据源某列数据不同绑定不同的控件setEditor

    Grid 根据数据源某列数据不同绑定不同的控件,例如:文本框和下拉框 主要代码写在grid的  plugins: [rowEditing],下面这是定义的rowEditing对象,这里面的要定义成 E ...

  8. EXTJS 4.2 资料 控件GroupingGrid

    http://www.shuyangyang.com.cn/jishuliangongfang/qianduanjishu/2013-11-17/179.html

  9. 团体程序设计天梯赛-练习集L1-008. 求整数段和

    L1-008. 求整数段和 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 杨起帆 给定两个整数A和B,输出从A到B的所有整数以及这些 ...

  10. sql批量删除wordpress所有日志修订revision

    wordpress日志修订是所有速度慢的罪恶之源,每次在后台发布或修改文章的时候,数据库都会产生一个revision版本的记录,几百篇日志会有几千条日志修订的记录,如果更多文章的话,那一个网页打开可能 ...