/*******************************************************************************
* 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. 用上新的电脑装上了VS2013了

    今天老魏终于把配置好的电脑拿回来了,16G的内存,I7 4770CPU.这回啊,老魏终于可以舍弃我的本本了,装上了SQL Server,虚拟机等等运行高内存的程序,感觉就是爽.明天老魏就可以用VS20 ...

  2. 基于SuperSocket实现的WebSocket(前端)

    本文内容是搭配后端使用的,没看过WebSocket后端实现的童鞋们戳这里 咳咳,其实前端实现相对就容易很多了,因为我们有JavaScript WebSocket Api,它看上来大致是这样的: var ...

  3. iOS5编程--ARC在工程上的相关设置

    在创建工程的时候,我们可以指定工程是否使用ARC技术,如下图 选中表示支持ARC, 在Beta5以前的版本中,不提供这个选项,非常麻烦. 如果是你拿到的工程,那么可以通过设置来改变,如下图所示 如果不 ...

  4. js数组的迭代

    以下介绍两种数组形式的迭代:一是简单的数组:二是数组里面套Object(json格式). 一.var arr=[1,2,3] var arr=[1,2,3] for (var i = 0; i < ...

  5. WCF 绑定的选择

    选自<WCF服务编程中文版> 第一章 WCF基础 绑定服务之间的通信方式是多种多样的,有多种可能的通信模式.包括:同步的请求/ 应答(Request/Reply)消息,或者异步的“即发即弃 ...

  6. ssh远程执行命令并自动退出(已测试通过)

    转自:http://blog.csdn.net/fdipzone/article/details/23000201 ssh命令格式如下: usage: ssh [-1246AaCfgKkMNnqsTt ...

  7. POJ1860——Currency Exchange(BellmanFord算法求最短路)

    Currency Exchange DescriptionSeveral currency exchange points are working in our city. Let us suppos ...

  8. Oracle10g 回收站及彻底删除table : drop table xx purge

    drop后的表被放在回收站(user_recyclebin)里,而不是直接删除掉.这样,回收站里的表信息就可以被恢复,或彻底清除. 1.通过查询回收站user_recyclebin获取被删除的表信息, ...

  9. 《RabbitMQ in action》

    Producers create messages and publish (send) them to a broker server (RabbitMQ).What’s a message? A ...

  10. HDU1054Strategic Game(最小顶点覆盖数)

    我们来先了解一下什么是最小顶点覆盖: 图G的顶点覆盖是一个顶点集合V,使得G中的每一条边都接触V中的至少一个顶点.我们称集合V覆盖了G的边.最小顶点覆盖是用最少的顶点来覆盖所有的边.顶点覆盖数是最小顶 ...