Android系统中硬件访问服务框架(JNI HAL)及实例

本文详细介绍了Android系统中硬件访问服务框架JNI和HAL的实现过程,以LED服务为例,包括JNI本地方法注册、HAL本地方法调用、服务注册、接口实现等步骤,并提供了相关代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在学习了硬件访问服务框架之后,以led为例,总结了Android app通过服务访问硬件的框架
这里写图片描述
实现:
1. JNI和HAL
  //用来注册JNI本地方法(jniRegisterNativeMethods)
  实现com_android_server_LedService.cpp

  //实现HAL本地方法调用c函数:open、close、ioctl 具体实现参考文章最后
  hal_led.c
  hal_led.h
2. 修改onload.cpp
  register_android_server_LedService(env); 调用各个硬件JNI中的注册本地方法的接口函数  进行本地方法的注册
  最终编译生成libandroid_servers.so
3. 修改SystemServer.java 创建一个LedService对象并add这个service
  System.loadLibrary(“android_servers”); //加载库,执行jniOnLoad方法
  LedService led = new LedService();
  ServiceManager.addService(“led”, led);
4. 创建LedService.java 去调用JNI提供的native方法
  这个LedService类要继承ILedService接口,实现接口中的方法。至此,一个LedService服务就创建成功了,但是最终要通过步骤3将这个服务添加到系统中通过service_manager这个进程来进行管理所有的服务。
5. 创建ILedService.java接口,供app使用
  这个接口通过编写一个对应的ILedService.aidl文件然后mmm编译在out目录下生成对应的ILedService.java接口, 参考IVibratorService.aidl文件。

编写HAL代码:
  JNI 向上提供本地函数,向下加载HAL文件并调用 HAL的函数
  HAL 负责访问驱动程序执行硬件操作

JNI加载HAL的实质是JNI如何使用dlopen来加载HAL的动态库
1. JNI如何使用HAL
  a. 使用hw_get_module获得hw_module_t结构体
  b. 调用module->methods->open(module, name, &device); // name – 设备的名字,一个so可能包含多个device
调用moudle的open函数获取一个hw_device_t结构体(设备结构体)。
(light_device_t*)device; //并且将设备结构体转换为自定义的结构体
2. HAL怎么写
  a. 要实现一个名字为HMI的hw_module_t结构体
  b. 要实现一个open函数,根据传入的name返回一个设备自定义结构体,这个结构体的第一成员是hw_device_t结构体。

对修改或者新加的文件处理:
led_hal.c
  hardware/libhardware/modules/led
  mk文件可以cp ../vibratory/Android.mk进行修改
led_hal.h
  hardware/libhardware/include/hardware
  com_android_service.led.cpp
  frameworks/base/services/core/jni

ILedLService.aidl
  frameworks/base/core/java/android/os/ILedService.aidl
  frameworks/base$ vi Android.mk进行修改
  生成.java需在当前目录下执行mmm命令

SystemServer.java
  frameworks/base/services/java/com/android/server

LedService.java
  frameworks/base/services/core/java/com/android/server
  修改frameworks/base/services/core/Android.mk

onload.cpp
  frameworks/base/services/core/jni
  修改frameworks/base/services/core/jni/Android.mk

mmm frameworks/base/services
mmm hardware/libhardware/modules/led
make snod
./gen-img.sh
从新烧写system.img

最后app如何使用:
1. as工程要包含什么?
  out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar
2. 怎么包含
  a. Creating a module library and adding it to module dependencies
  file->project structure->+ ->import .jar ->classer.jar
  file->project structure->app->dependencies ->+ module depends -> classer
  b. 编译报错:java.lang.OutOfMemoryError: GC overhead limit exceeded
  修改build.

7 Android的Audio系统 7.1 Audio系统的综述 Audio系统架构和代码路径 7.2 meida库中Audio相关接口 Audio系统的本地核心接口,类的层次结构 7.3 Audio系统和上层接口 Audio系统的JAVA层次的接口 7.4 Audio硬件抽象层 Audio系统的移植,Audio硬件抽象层的实现方法 ALSA Audio HAL实现 8 Android的Video 输入输出系统 8.1 Video输入输出系统的综述 视频输入输出系统架构和代码路径 8.2 Overlay系统 视频输出系统的结构 8.3 Overlay的硬件抽象层 视频输出系统的移植,抽象层实现 8.4 Camera系统与上层接口 Camera系统的层次结构 8.5 Camera的硬件抽象层 Camera系统的移植 Camera和Overlay的结合与数据传送 9 Android的多媒体系统 9.1 多媒体系统的结构 应用到底层的层次结构 9.2 media核心库的结构 多媒体本地代码的结构 9.3 多媒体部分的上层代码 照相机,媒体播放,媒体录制的框架结构 9.4 PackageVideo的架构 OpenMAX编译码插件的集成 9.5 stagefright的架构与实现(Éclair新增) 10 Android的电话系统 10.1 电话系统结构 Android电话系统的层次结构 10.2 电话系统组成部分 Android电话系统的本地和JAVA程序运行流程 10.3 电话系统移植层 为特定Modem移植的方法 11 Android的连接部分 11.1 WIFI无线局域网的部分 11.2 蓝牙部分 11.3 GPS部分 12 Android的传感器系统 12.1 Android传感器系统概述 12.2 Android传感器系统的层次结构 12.3 Android传感器系统硬件抽象层和移植 重力加速度等传感器的移植 12.4 Android传感器系统的使用 1.HAL 技术详解 1.1 HAL 架構解析 1.2 Service与Manager的意义与用途 1.3 libhardware 与 HAL API 1.4 Stub & Module 的观念 1.5 专题讨论:定义并撰写第一个HAL Stub 2.HAL Development 2.1 HAL Stub Analysis and Design (OOAD) 2.2 HAL Stub Class 2.3 HAL Stub Interface 2.4 专题讨论:开发 LEDHAL 模组 3.Android API Design 3.1 Abstract Class and Interface in Android 3.2 The Reuse of Framework Design 3.3 OOAD of new APIs 3.4 Implementaion of new APIs 3.5 Singleton Pattern to Android APIs 3.6 Factory Method Pattern to Android APIs 4.Extend Android API 4.1 如何加入 API 至 Android Framework 4.2 如何编译并制作独立 JAR 档 4.3 上机实验:开发LedService API 与制作mokoid.jar 程式库 5.JNI & Runtime Library 5.1 什么是 JNI 5.2 如何撰写 JNI & Native Method 5.3 如何制作 Android Runtime Library 5.4 专题讨论:如何开发与制作Runtime Library 6.5 专题讨论:SensorManager与SensorService实例 7.SystemService 与 HAL 整合7.1 IPC、 Remote method call与Binder观念说明 7.2 AIDL 介绍与IInterface设计观念解析 7.3 Activity & ApplicationContext 7.4 ServiceManager 7.5 专题讨论:LedService设计与ILedService探讨 8.Manager API (Refinement-架构优化) 8.1 SensorManager与 SensorService实例探讨 8.2 Remote Object观念与IBinder介绍 8.3 如何以Proxy Object整合Android Service 8.4 Long operations 的解析与实作细节 8.5 RemoteException 的解析与实作细节 8.6 Handler 与 Message 的解析与实作细节 8.7 Error Handling 9.专题探讨 9.1 整合驱动程式至Android 框架 9.2 撰写Anroid应用程式以控制LED 9.3 标准的Android HAL 架构 9.4 HAL Stub OOAD & Implementation
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值