每个硬件模块都必须有一个名为HAL_NODULE_INFO_SYM的数据结构,并且此数据结构的字段必须以hw_module_t开头,后跟模块具体信息。
每一个设备数据结构的第一个成员函数必须是hw_device_t类型,其次才是各个公共方法和属性
接下来就是JNI封装,即Android 驱动使用JNI调用
Android应用层调用Linux驱动的方式:
第一,通过在Android内核源码(不是linux内核源码)中添加HAL层、JNI层、开启系统服务,这是一个比较复杂的过程,很多标准的设备都采用这种方式设计,比如说wifi、gps、sensor等,这种调用过程看起来比较标准,但是如果作为第三方开发就会很麻烦,HAL层、JNI层,系统服务层,每层都需要编译Android内核源码,这样就会延长了产品的开发周期;第二,通过配置NDK环境,在NDK环境中直接编写JNI层,然后在Android应用层中添加类,加载JNI库即可调用设备的驱动
Android 下如何通过JNI向上层提供接口如何为Android硬件抽象层接口编写JNI方法,以便使得上层的Java应用程序能够使用下层提供的硬件服务
进入到frameworks/base/services/core/jni目录,新建com_android_server_HelloService.cpp文件
修改同目录下的onload.cpp文件,首先在namespace android增加register_android_server_HelloService函数声明:
修改同目录下的Android.mk文件,在LOCAL_SRC_FILES变量中增加一行
编译和重新找亿system.img:
USER-NAME@MACHINE-NAME:~/Android$ mmm frameworks/base/services/jni
USER-NAME@MACHINE-NAME:~/Android$ make snod
为Android系统的Application frameworks层增加硬件访问服务驱动程序的最终目的,是为了使得最上层的应用程序能够使用这些硬件提供的服务来为用户提供软件功能。对Android系统上的应用软件来说,就是要在系统的Application Frameworks层为其提供硬件服务
在Android系统中,硬件服务一般是运行在一个独立的进程中为各种应用程序提供服务。因此,调用这些硬件服务的应用程序与这些硬件服务之间的通信需要通过代理来进行。为此,我们要先定义好通信接口。
进入到frameworks/base/core/java/android/os目录,新增IHelloService.aidl接口定义文件
编译IHelloService.aidl接口
这样,就会根据IHelloService.aidl生成相应的IHelloService.Stub接口
五.进入到frameworks/base/services/java/com/android/server目录,新增HelloService.java文件:
修改同目录的SystemServer.java文件,在ServerThread::run函数中增加加载HelloService的代码:
编译HelloService和重新打包system.img
为Android 系统内置Java程序,测试Application Frameworks层的硬件服务