I.MX6 Android frameworks services 文件架构
/*******************************************************************************
* 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 文件架构的更多相关文章
- I.MX6 Android USB Touch eGTouchA.ini文件存放
/******************************************************************** * I.MX6 Android USB Touch eGTo ...
- I.MX6 android 禁止低电量自动关机
/************************************************************************ * I.MX6 android 禁止低电量自动关机 ...
- Android群英传》读书笔记 (1) 第一章 Android体系与系统架构 + 第二章 Android开发工具新接触
第一章 Android体系与系统架构 1.Dalvik 和 ARTDalvik好比是一辆可折叠的自行车,平时是折叠的,只有骑的时候,才需要组装起来用.ART好比是一辆组装好了的自行车,装好就可以骑了. ...
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
相关:http://www.cnblogs.com/wytiger/p/5996876.html 和MVC框架模式一样,Model模型处理数据代码不变在Android的App开发中,很多人经常会头疼于 ...
- I.MX6 Android 5.1 快速合成系统
/**************************************************************************** * I.MX6 Android 5.1 快速 ...
- I.MX6 Android netperf
/***************************************************************************** * I.MX6 Android netpe ...
- I.MX6 Android U-blox miniPCI 4G porting
/************************************************************************** * I.MX6 Android U-blox m ...
- I.MX6 android 设置 默认 动态桌面
/************************************************************************ * I.MX6 android 设置 默认 动态桌面 ...
- I.MX6 Android iperf3 porting failed
/***************************************************************************** * I.MX6 Android iperf ...
随机推荐
- Hibernate 关联 set 和 list 对比
这里考虑的不是hibernate配置文件相关的list和set.而是实际注入的java集合. 1.就单纯java集合的效率对比 list要比set效率高,因为set是把元素存在map的key所在位置上 ...
- oracle分页与rownum
Oracle分页(limit方式的运用) Oracle不支持类似于 MySQL 中的 limit. 但你还是可以rownum来限制返回的结果集的行数. 第一种 select * from a_matr ...
- [摘] SQLPLUS Syntax
You use the SQLPLUS command at the operating system prompt to start command-line SQL*Plus: SQLPLUS [ ...
- Calendar GData API / Google Calendar Connectors deprecation
http://googleappsupdates.blogspot.fr/2014/06/calendar-gdata-api-google-calendar.html
- ashx与验证码
using System; using System.Drawing; using System.Drawing.Imaging; using System.Drawing.Drawing2D; us ...
- Deferred Shading(延迟渲染)
1.简介 在计算机图形学的词典里,Shading表示“对受光物体的渲染”,这个渲染过程包括下面几步[1]: 1) 计算几何多边形(也就是Mesh). 2) 决定表面材质特性,例如法 ...
- Mybatis+SpringMVC的项目环境搭建
一.web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=&qu ...
- spring的配置模式与注解模式基础
“依赖注入”是spring的核心特征,在Web服务器(如Tomcat)加载时,它会根据Spring的配置文件中配置的bean或者是通过注解模式而扫描并装载的bean实例自动注入到Application ...
- CQRS学习——集成ASP.NET Identity[其五]
[其实和Cqrs没啥关系] 缘由 其实没啥原因,只是觉得以前写了不知多少遍的用户登录复用性太差,实现的功能也不多. 依赖的Nuget包 简单登陆 就简单登陆而言,只需要实现如下接口/抽象类: Stor ...
- [转载]JS对URL的编码
虽然escape().encodeURI().encodeURIComponent()三种方法都能对一些影响URL完整性的特殊字符进行过滤.但后两者是将字符串转换为UTF-8的方式来传输,解决了页面编 ...