/*******************************************************************************
* 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. Python本地化例子 - gettext 模块

    关键字:Python 3.4,gettext,本地化,Localization OS:Windows 7,Mac 1. 创建一个locsample.py文件,文件内容如下,把所有需要本地化的字符串放到 ...

  2. Foreign Exchange

     10763 Foreign ExchangeYour non-profit organization (iCORE - international Confederation of Revolver ...

  3. 用JS给浏览器的关闭按钮添加事件

    以下是指在js中实现,而非 <body onunload="close()"> 这种方法! 因为这样是在unload掉body的时候触发,而无论任何浏览器,都会在关闭的 ...

  4. (转)《深入理解java虚拟机》学习笔记3——垃圾回收算法

    Java虚拟机的内存区域中,程序计数器.虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭:栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构 ...

  5. RichTextBox控件-主要用于输入输出编辑文本信息

    1.在RichTextBox控件中添加超链接文字 private void btn_Add_Click(object sender, EventArgs e) { rtbox_HyperLink.Ap ...

  6. log4net 配置

    1.在项目中引入log4net.dll组件: 2.在App.congfig中做如下修改 在加入如下内容: 这个节点最好放在<configuration>下的第一个位置,不然在服务里会报错. ...

  7. 【CSLA】Component-based,Scalable,LogicalArchitecture

    我能说我没看懂吗 ? http://www.cnblogs.com/lonely7345/archive/2010/02/06/1665171.html

  8. Excel与SqlServer的导入导出问题总结

    1.Excel导入到SqlServer中,如果Excel里面的某一列,即有文本,又有数字,导入SqlServer中这一列的类型将会是float,Excel里面对应的文本值将导不进来,为null. 解决 ...

  9. EXTJS 4.2 资料 跨域的问题

    关于跨域,在项目开发中难免会遇到:之前笔者是用EXTJS3.0开发项目的,在开发过程中遇到了关于跨域的问题,但是在网上找到资料大部分都是ExtJs4.0以上版本的 在ExtJs中 例如:Ext.Aja ...

  10. 根据不同ip进入不同页面

    function GetIP() { $cip = ""; if(!empty($_SERVER["HTTP_CLIENT_IP"])){ $cip = $_S ...