HAL

每个硬件模块都必须有一个名为HAL_NODULE_INFO_SYM的数据结构,并且此数据结构的字段必须以hw_module_t开头,后跟模块具体信息。

每一个设备数据结构的第一个成员函数必须是hw_device_t类型,其次才是各个公共方法和属性

Android 系统HAL层开发

接下来就是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层的硬件服务


点击打开链接









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值