Framework如何调用Hardware以及Hardware的简单实现

8 篇文章 0 订阅
7 篇文章 0 订阅

前言

在上一篇博客中介绍了Android9.0中的手动调节亮度的流程,但当时只讲到framwork的整个调用过程,并未讲到如何调用hardware层,这一章来讲一下如何调用hardware,以及如何实现简单的hareware.

Kernel: v4.4.126
Device: rk3399
Platform Version: Android 7.1

如何调用(以亮度调节为例,其他的也一样)

主要分为下面3个步骤:

  1. 使用hardware.c中定义的hw_get_module获取hal库中hw_module_t全局变量的地址。
    1

  2. 利用全局变量hw_module_t地址调用它内部结构体变量hw_module_methods_t的open函数指针,并且将hw_module_t作为参数传入open函数,在open函数内将hw_module_t赋值给hw_device_t中定义的hw_module_t变量,最后获取到hw_device_t的地址。
    1

  3. 利用上面的hw_device_t的地址就可以调用hw_device_t中定义的指针函数对应的实现。例如:set_light()
    1

上面图中代码全在com_android_server_SerialService.cpp中,如果看完还是不太理解,请看完下面的实现步骤,再折回来看。

如何实现简单的hardware?

首先要知道hardware.h中有3个重要的公用结构体

struct hw_module_t;
struct hw_module_methods_t;
struct hw_device_t;

它们之间的关系

hw_module_t结构体中包含hw_module_methods_t的结构体指针
hw_device_t结构体中包含hw_module_t的结构体指针
结合它们之间的关系,再理解一下上面的3个调用步骤
1
1

接下讲如何实现:

  1. 首先是否基于hw_module_t和hw_device_t扩充自己的xx_module_t和xx_device_t

    如果基于hw_module_t扩充,第一个成员变量必须包含 hw_module_t
    如果基于hw_device_t扩充,第一个成员变量必须包含 hw_device_t

例如相机:
1

例如亮度:

1
2. 在源码中定义全局变量hw_module_t或者基于hw_module_t扩充的结构体全局变量

例如相机:
1

例如亮度:

1
3. 接下来就需要实现hw_module_t中的hw_module_methods_t结构体指针的open函数了。

1
4. 然后就是在open里面,创建基于hw_device_t的扩充结构体变量,并把hw_module_t赋值给hw_device_t中定义的hw_module_t指针

1
5. 最后我们得到了基于hw_device_t的结构体变量,里面包含了hw_module_t的信息,并且此时就可以调用hw_device_t中定义的可被调用的方法了。

1

结合后面hardware的实现流程,再回过头去看调用,就会清晰很多了。

转载请注明出处:http://www.wolfnx.com/2020/03/16/Brightness-Set-Stream

作者 : wolfnx
邮箱 : wolfnx@outlook.com
邮箱2 : lostnx@gmail.com

好的,我理解了你的问题。那么我来回答你的问题: 首先,HAL(Hardware Abstraction Layer)层是Android系统中的一层抽象,它为上层提供了一组标准的接口,使得上层代码不需要关心具体硬件的实现,从而提高了代码的可移植性和复用性。 而JNI(Java Native Interface)是Java语言调用本地方法的一种方式。通过JNI,我们可以在Java代码中调用C/C++代码,而C/C++代码可以访问系统底层的硬件资源。 因此,你的问题可以分为三个部分: 1. 自定义实现一个HAL层接口 2. 通过JNI层回调给Framework层 3. 最后给APP调用使用 下面我分别给出每个部分的实现思路: 1. 自定义实现一个HAL层接口 首先,你需要明确你要实现的HAL层接口的功能。然后,你可以根据硬件的实现,编写对应的C/C++代码。在代码中,你需要实现HAL层接口的函数,并且将这些函数封装在一个动态链接库中。通常情况下,你需要使用Android NDK来编译生成这个动态链接库。 2. 通过JNI层回调给Framework层 接下来,你需要在JNI层编写代码,将HAL层接口封装成Java方法。具体而言,你需要使用JNI提供的函数,将Java方法映射到C/C++函数上。然后,在C/C++函数中,你可以通过调用HAL层接口的函数,来实现相应的功能。最后,你需要将JNI方法封装成动态链接库,并且在Android应用中加载这个动态链接库。 3. 最后给APP调用使用 最后,你可以在Android应用中调用JNI方法,从而实现对HAL层接口的调用。具体而言,你需要在Java代码中使用System.loadLibrary()方法,来加载JNI动态链接库。然后,你可以通过JNI方法调用HAL层接口,来实现相应的功能。最终,你可以将这些功能封装成Android API,供其他应用调用。 总结: 通过上述步骤,你可以自定义实现一个HAL层接口,并且通过JNI层回调给Framework层,最后给APP调用使用。当然,这只是一个大致的实现思路,具体实现还需要根据具体的硬件和应用场景进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值