Android HIDL第一个demo编写: HIDL Test——实现Framework&App层与HAL进程IPC

1.HIDL简介

HAL接口定义语言(简称 HIDL,发音为"hide-l")是用于指定HAL和其用户之间的接口的一种接口描述语言(IDL).HIDL允许指定类型和方法调用(会汇集到接口和软件包中).从更广泛的意义上来说,HIDL 是指用于在可以独立编译的代码库之间进行通信的系统.
HIDL旨在用于进程间通信(IPC).进程之间的通信采用Binder机制.对于必须与进程相关联的代码库,还可以使用直通模式(在Java中不受支持).

2.HIDL设计目的

HIDL 的目标是,可以在无需重新构建 HAL 的情况下替换框架.HAL 将由供应商或 SOC 制造商构建.并放置在设备的 /vendor 分区中,这样一来,就可以在框架自己的分区中通过OTA替换框架,而无需重新编译 HAL.

3.客户端和服务器实现

HIDL 接口具有客户端和服务器实现:
HIDL 接口的客户端实现是指通过在该接口上调用方法来使用该接口的代码.
服务器实现是指 HIDL 接口的实现,它可接收来自客户端的调用并返回结果(如有必要).
在从 libhardware HAL转换为HIDL HAL的过程中,HAL 实现成为服务器,而调用 HAL 的进程则成为客户端.默认实现可提供直通和Binder化HAL.

4.HIDL demo编写

基于版本:
Android9.0

进入android根目录,创建demo目录:

mkdir -p vendor/heisenberg/interfaces/hidltest/1.0

HAL代码:

vendor/heisenberg/interfaces/hidltest/1.0$ touch IHidlTest.hal
package vendor.heisenberg.hidltest@1.0;

interface IHidlTest {
   
    //传入一个string,返回一个string
    //generates:生成,表示一个返回值给客户端的接口方法
    helloWorld(string name) generates (string result);
};

使用脚本update-makefiles.sh生成HAL代码对应的bp文件:

Heisenberg海森堡:~/code/android/vendor/heisenberg/interfaces$ ./update-makefiles.sh
Updating makefiles for vendor.heisenberg in /home/.../android/vendor/heisenberg/interfaces.
...
Updating vendor.heisenberg.hidltest@1.0
...

Android.bp文件:

// This file is autogenerated by hidl-gen -Landroidbp.
hidl_interface {
   
    name: "vendor.heisenberg.hidltest@1.0",
    root: "vendor.heisenberg",
    srcs: [
        "IHidlTest.hal",
    ],
    interfaces: [
        "android.hidl.base@1.0",
    ],
    gen_java: true,
}

注意:
生成的Android.bp中包含这个字段:gen_java: true,这个字段的使用,使得我们在框架层和应用层不需要添加任何JAVA类,即可直接使用.

编译推包:

make -j8 vendor.heisenberg.hidltest@1.0
adb root;adb remount
adb push out/target/product/heisenberg/vendor/lib64/vendor.heisenberg.hidltest@1.0.so /vendor/lib64/
adb shell sync

接着使用hidl-gen工具生成对应的.h .cpp文件:

//先编译hidl-gen工具
make -j64 hidl-gen
//c++-impl生成hal的c++,h的标准文件:
hidl-gen -o vendor/heisenberg/interfaces/hidltest/1.0/default/ -L c++-impl -r vendor.heisenberg:vendor/heisenberg/interfaces/ -r android.hidl:system/libhidl/transport vendor.heisenberg.hidltest@1.0

HidlTest.h文件:

#ifndef VENDOR_HEISENBERG_HIDLTEST_V1_0_HIDLTEST_H
#define VENDOR_HEISENBERG_HIDLTEST_V1_0_HIDLTEST_H

#include <vendor/heisenberg/hidltest/1.0/IHidlTest.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>

namespace vendor {
   
namespace heisenberg{
   
namespace hidltest 
  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我理解了你的问题。那么我来回答你的问题: 首先,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、付费专栏及课程。

余额充值