欢迎来到天天文库
浏览记录
ID:37293528
大小:548.76 KB
页数:14页
时间:2019-05-21
《深入浅出 - Android系统移植与平台开发(十) - led HAL案例分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、本文由兰州白癜风医院http://www.fzjfh.com/收集,转载请注明出处深入浅出-Android系统移植与平台开发(十)-ledHAL案例分析通过前两节HAL框架分析和JNI概述,我们对Android提供的StubHAL有了比较详细的了解了,下面我们来看下led的实例,写驱动点亮led灯,就如同写程序,学语言打印HelloWorld一样,如果说打印HelloWorld是一门新语言使用的第一声吆喝,那么点亮led灯就是我们学习HAL的一座灯塔,指挥我们在后面的复杂的HAL代码里准确找到方向。Le
2、dHAL实例架构上图描述了我们Led实例的框架层次:lLedDemo.java:是我们写的Android应用程序lLedService.java:是根据LedHAL封装的Java框架层的API,主要用于向应用层提供框架层API,它属于Android的框架层llibled_runtime.so:由于Java代码不能访问HAL层,该库是LedService.java对应的本地代码部分lled.default.so:针对led硬件的HAL代码LedDemo通过LedService提供的框架层API访问Led设
3、备,LedService对于LedDemo应用程序而言是Led设备的服务提供者,LedService运行在Dalvik中没有办法直接访问Led硬件设备,它只能将具体的Led操作交给本地代码来实现,通过JNI来调用Led硬件操作的封装库libled_runtime.so,由HALStub框架可知,在libled_runtime.so中首先查找注册本文由兰州白癜风医院http://www.fzjfh.com/收集,转载请注明出处本文由兰州白癜风医院http://www.fzjfh.com/收集,转载请注明出
4、处为led的硬件设备module,找到之后保存其操作接口指针在本地库中等待框架层LedService调用。led.default.so是HAL层代码,它是上层操作的具体实施者,它并不是一个动态库(也就是说它并没有被任何进程加载并链接),它只是在本地代码查找硬件设备module时通过ldopen”杀鸡取卵”找module,返回该硬件module对应的device操作结构体中封装的函数指针。其调用时序如下:LedHAL实例代码分析我们来看下led实例的目录结构:本文由兰州白癜风医院http://www.fz
5、jfh.com/收集,转载请注明出处本文由兰州白癜风医院http://www.fzjfh.com/收集,转载请注明出处主要文件如下:com.hello.LedService.cpp:它在frameworks/services/jni目录下,是的Led本地服务代码led.c:HAL代码led.h:HAL代码头文件LedDemo.java:应用程序代码LedService.java:Led框架层服务代码在Android的源码目录下,框架层服务代码应该放在frameworks/services/java/包名
6、/目录下,由Android的编译系统统一编译生成system/framework/services.jar文件,由于我们的测试代码属于厂商定制代码,尽量不要放到frameworks的源码树里,我将其和LedDemo应用程序放在一起了,虽然这种方式从Android框架层次上不标准。另外,本地服务代码的文件名要和对应的框架层Java代码的名字匹配(包名+类文件名,包目录用“_“代替)。有源码目录里都有对应的一个Android.mk文件,它是Android编译系统的指导文件,用来编译目标module。1)An
7、droid.mk文件分析先来看下led源码中①号Android.mk:include$(callall-subdir-makefiles)代码很简单,表示包含当前目录下所有的Android.mk文件先来看下led_app目录下的③号Android.mk:#调用宏my-dir,这个宏返回当前Android.mk文件所在的路径LOCAL_PATH:=$(callmy-dir)#包含CLEAR_VARS变量指向的mk文件build/core/clear_vars.mk,它主要用来清除编译时依赖的编译变量inc
8、lude$(CLEAR_VARS)#指定当前目标的TAG标签,关于其作用见前面Android编译系统章节LOCAL_MODULE_TAGS:=user#当前mk文件的编译目标模块LOCAL_PACKAGE_NAME:=LedDemo#编译目标时依赖的源码,它调用了一个宏all-java-files-under,该宏在build/core/definitions.mk中定义#表示在当前目录下查找所有的java文件,将查找到的java文件返回L
此文档下载收益归作者所有