Android应用层调用驱动的全过程 精简版

上一篇写了很详细的一篇应用层调用驱动的全流程。本着把书读薄的精神,我决定写个简版。

app层:Activity与Service的关系

首先是activiy中调用了service去执行底层操作,这个service实现了根据aidl接口文件自动创建的java接口文件IService,这样说还不准确,Service对象是实现了IService的代理子接口Stub。所以,activity是通过IService.Stub.asInterface这样的方式获得Service实例的。

framework层:

1.主要问题是怎么实现Java到C的转化。这个转化其实是两个文件实现的,一个是Service,它负责调用并封装JNI接口。一个是JNI接口,它负责调用并封装HAL的函数。

2.Service是java文件,怎么调用C呢?其实JNI文件注册了一个native method_tables[]。有所有的JNI函数。然后,Service这个Java文件只需要调用JNI注册表里的函数就行了。实际上是怎么做的呢?在Service里声明native函数就行了。

private static native boolean init_native(); 

这一步很关键,不然java层是找不到C层的函数指针的。

HAL层:

上面提过JNI会调用并封装HAL层的函数了。那HAL层又做了什么工作?那就是读取文件节点。HAL层提供了所有的setVal,getVal,open,close等各种自定义的函数供上层调用,所有函数的实现都是通过fctl.h提供的文件操作read/write/open/close来从文件节点获取驱动提供的数据的。

补充下:该层有个巧妙的设计,就是把通用的接口如:hw_device_t和hw_module_t作为自定义结构体的common成员变量,以便于JNI调用的时候通过它获得自定义的结构体变量,且methods->open的时候,传进hw_deivce_t(JNI只会初始化一个xx_device_t自定义结构体,通过强制类型转化把它转化为hw_device_t传给open函数)

驱动层:

它就负责向/proc ; /sys/class; /dev下创建的文件节点提供数据了。

 

你可能感兴趣的:(android机制,android,HAL,软件系统架构)