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 ...
随机推荐
- c语言随机数
写得我自己都看不好了:大家都比较喜欢吃快餐,只需要尽快告诉读者怎么用起来就行了.不想听啰啰嗦嗦说一堆,然后例程还特别麻烦 so: 1.基本 int seed = time(0);//#include ...
- 【postgresql】创建自增SEQUENCE
CREATE SEQUENCE circlefence_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1; alte ...
- 总有你需要的之 ios 小技巧 (下)
图片上绘制文字 写一个UIImage的category NSMutableParagraphStyle* paragraphStyle = [[NSParagraphStyle defaultPara ...
- git/ TortoiseGit 在bitbucket.org 使用证书登陆
背景:使用https协议在bitbucket中进行pull,push 时每次都要输入密码,比较麻烦还耽误时间,在网上找了下保存密码的方式 使用在用户环境变量中配置_netrc 文件的方式(http:/ ...
- 1588: [HNOI2002]营业额统计 - BZOJ
Description营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天 ...
- zTree -- jQuery 树插件
http://www.ztree.me/v3/main.php#_zTreeInfo http://plugins.jquery.com/zTree.v3/ 例子:http://www.ztree.m ...
- Django 后台搭建
# Django settings for gameadmin project. DEBUG = True TEMPLATE_DEBUG = DEBUG ADMINS = ( # ('Your Nam ...
- Nagios+msn+fetion自定义时间发送报警消息
转自http://blog.csdn.net/deccmtd/article/details/6063467 Nagios+fetion发送手机报警使用了几个月.每次报警短信来都要看下手机.感觉麻烦. ...
- Debugging with GDB 用GDB调试多线程程序
Debugging with GDB http://www.delorie.com/gnu/docs/gdb/gdb_25.html GDB调试多线程程序总结 一直对GDB多线程调试接触不多,最近因为 ...
- C#日期格式及其运算
C#日期时间格式化 转载: http://www.cnblogs.com/hantianwei/archive/2010/09/23/1833228.html