1、(JNI访问)Java –> C库 app –>c库
2、硬件访问服务
通过硬件服务 | + JNI 硬件服务
硬件访问服务: 1、loadLibrary 加载C库
2、JNI_Onload:注册本地方法 (分别调用各个硬件的函数来注册本地方法) { LED { 振动器 { 串口
3、SystemServer:对每个硬件 {构造Service(使用本地方法) {addService
Server–>Service(服务器提供服务)
4、APP怎么使用{获得服务:getService {使用服务:执行service方法
/** * The main entry point from zygote. */ public static void main(String[] args) { new SystemServer().run(); }加载C库
private void run() { // Initialize native services. System.loadLibrary("android_servers"); }调用到onload.cpp
extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv* env = NULL; jint result = -1; 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); return JNI_VERSION_1_4; }函数名+com前缀 com_android_server_SerialService.cpp(JNI文件) 完全可以在这个里面实现硬件操作的实现。
int register_android_server_VibratorService(JNIEnv *env) { //注册本地方法 return jniRegisterNativeMethods(env, "com/android/server/VibratorService", method_table, NELEM(method_table)); }硬件操作过于复杂: 单独写在HAL文件 {1、容易修改 {2、出于保密
内核研究所 认证博客专家 Linux Kernel Android 一直从业于半导体行业,曾为Linux内核开源文档社区提交过若干文档。主要从事Linux、Android相关系统软件开发工作,负责Soc芯片BringUp及系统软件开发,喜欢阅读内核源代码,在不断的学习和工作中深入理解内存管理,进程调度,文件系统,设备驱动等内核子系统。