Linux &android 驱动开发浅析

来源:互联网 发布:指南针软件如何注销 编辑:程序博客网 时间:2024/06/18 07:59

Android系统中要使用一个硬件,需要在Linux内核编写驱动程序、在用户空间编写HAL,编写JNI方法为虚拟机框架层提供java接口,在Android应用程序框架层增加服务接口,最终,在应用中,调用服务接口,完成业务应用。

每一层接口的实现,无非是按照信息通信标准,包含两种,一种是约定函数接口和适当配置参数文件,一种是约定交互信息内容。之所以建立这些约定,主要是为了框架集成简单的需要。每一层都提供入口,出口标准,这样才能确定框架,如果没有标准,加个功能,还得该框架,岂不挂了;有了框架,在增加新设备、新功能的时候,只需要按照每层接口规范,增加相应模块即可。

内核驱动与HAL的分离完全是因为商业目的而进行的分层,通过该两层的封装,上层的用户就可以不用关心设备细节,编写纯应用。比如编写测试硬件的C命令(应用程序),你就可以在HAL上层实现即可。编写JNI接口纯粹是为了实现JavaC代码对接的需要,为了能够让虚拟机调用本地接口JNIJNI也制定了自己的接口规范,这个规范实际上是子描述的。从这个角度上来讲,虚拟机包含两层含义:一层就是机器指令执行器,他相当于一个CPU,借鉴了程控CPU的概念,制定了自定义的汇编语法,也既是自己的字节码,如此说了java的虚拟机不过是移花接木,算补上什么创新,另一层是JNI接口管理器,根据java调用需求,加载合适的JNI库,并将计算需求转嫁到具体的JNI库。从这一点可以认为虚拟机就是个精通两种语言的翻译,典型的适配器。

做到这一步,可以说是已经可以编写java代码通过调用jni方法来使用设备了。但是,总不能每个应用都直接调用JNI吧,那也太麻烦了。最好的方法,就是我们编写一个服务为其他的java程序提供更简单的接口,纯java的,这就涉及到不同的进程通信问题,想想corbadcom,真是拿来主义,借鉴IDL,谷歌实现了一个AIDLandroidInterface Descriptionlanguage),最终实现了一个轻量级的进程通信体制(IBinder)。所以说,在应用层增加服务接口的工作就是实现对jni封装的硬件接口的调用,并通过AIDL发布接口,当然是要实现一个服务了。

再往后,你懂的。如果你调试不通,检查那些约定、规范吧。


原创粉丝点击