Android HIDL接口添加

一.HIDL介绍

HIDL的全称是HAL interface definition language(硬件抽象层接口定义语言),是Android
Framework 与Android HAL之间的接口。HIDL 旨在用于进程间通信 (IPC),进程之间的通信
采用 Binder 机制。

二.HIDL 与AIDL 的对比

三.HIDL接口添加 

HIDL接口路径:

hardware\interfaces\imw\1.0\

路径下有两个文件:

Android.bpIImwManager.hal

Android.bp:

hidl_interface {name: "vendor.isolution.hardware.imw@1.0",  //FQName 的全名root: "vendor.isolution.hardware",  //定义好的 package root name//system_ext_specific: true,srcs: ["IImwManager.hal",],interfaces: ["android.hidl.base@1.0", //编译过程中依赖的接口名称],gen_java: true,  //是否编译为 Java 使用的接口
}

IImwManager.hal文件:

package vendor.isolution.hardware.imw@1.0; // 当前package包名import IImwManagerClientCallback;  // 导入其它package包
import IUpdateEngineClientCallback;interface IImwManager   // 定义一个interface
{onCreate();onInitStart();onInitCompleted();onStart();onSystemAppStart();onBootanimationExit();onBootCompleted();onReboot();onRecovery();onSleep();onShutdown();};

HIDL生成的文件路径:

/out/soong/.intermediates/vendor/isolution/hardware/interfaces/imw/1.0/vendor.isolution.hardware.imw@1.0

编译后模块对应的文件:

vendor.isolution.hardware.imw@1.0.so

当 IHelloworld.hal 创建完成就可以创建对应的 HIDL 实现代码(Hidl Interface 和 service):

service.端java代码:

import vendor.isolution.hardware.imw.V1_0.IImwManager; // 导入package包private IImwManager halManager = null;halManager.onCreate();
halManager.onInitStart();
halManager.onInitCompleted();
halManager.onStart();
halManager.onSystemAppStart();
halManager.onBootanimationExit();
halManager.onBootCompleted();
halManager.onReboot();
halManager.onRecovery();
halManager.onSleep();
halManager.onShutdown();

实现Hidl Interface:

hardware\interfaces\imw\1.0\default\ImwManager.h

#ifndef VENDOR_ISOLUTION_HARDWARE_IMW_V1_0_IMWMANAGER_H_
#define VENDOR_ISOLUTION_HARDWARE_IMW_V1_0_IMWMANAGER_H_#include <log/log.h>
#include <android/log.h>
#include <hardware/hardware.h>
#include <hardware/fingerprint.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>#include <vendor/isolution/hardware/imw/1.0/IImwManager.h>using ::vendor::isolution::hardware::imw::V1_0::IImwManager;
using ::android::hardware::Return;
using ::android::hardware::Void;
using ::android::hardware::hidl_vec;
using ::android::hardware::hidl_string;
using ::android::sp;namespace vendor {
namespace isolution {
namespace hardware {
namespace imw {
namespace V1_0 {
namespace implementation {struct ImwManager : public IImwManager {public:ImwManager();~ImwManager();static IImwManager* getInstance();Return<void> setNotify(const sp<IImwManagerClientCallback>& clientCallback) override;Return<void> setNotifyUpdateEngine(const sp<IUpdateEngineClientCallback>& clientCallback) override;Return<void> onCreate() override;Return<void> onInitStart() override;Return<void> onInitCompleted() override;Return<void> onStart() override;Return<void> onSystemAppStart() override;Return<void> onBootanimationExit() override;Return<void> onBootCompleted() override;Return<void> onReboot() override;Return<void> onRecovery() override;Return<void> onSleep() override;Return<void> onShutdown() override;
};}  // namespace implementation
}  // namespace V1_0
}  // namespace imw
}  // namespace hardware
}  // namespace isolution
}  // namespace vendor

hardware\interfaces\imw\1.0\default\ImwManager.cpp

#include <utils/Log.h>#include <log/log.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <dirent.h>
#include <unistd.h>
#include <string.h>
#include <cutils/atomic.h>
#include <cutils/properties.h> // for property_get
#include <utils/misc.h>
#include <stdio.h>
#include <utils/threads.h>#include <fcntl.h>
#include <dlfcn.h>
#include <sys/shm.h>
#include <signal.h>#include "ImwManager.h"namespace vendor {
namespace isolution {
namespace hardware {
namespace imw {
namespace V1_0 {
namespace implementation {ImwManager::ImwManager() : mClientCallback(nullptr) {sInstance = this; // keep track of the most recent instanceonCreate();
}ImwManager::~ImwManager()
{ALOGW("~ImwManager\n");
}IImwManager* ImwManager::getInstance() {if (!sInstance) {sInstance = new ImwManager();}return sInstance;
}Return<void> ImwManager::onCreate()
{ALOGW("onCreate\n");return Void();
}Return<void> ImwManager::onInitStart()
{ALOGW("onInitStart\n");return Void();
}Return<void> ImwManager::onInitCompleted()
{ALOGW("onInitCompleted\n");return Void();
}Return<void> ImwManager::onStart()
{ALOGW("onStart\n");return Void();
}Return<void> ImwManager::onSystemAppStart()
{ALOGW("onSystemAppStart\n");return Void();
}Return<void> ImwManager::onBootanimationExit()
{ALOGW("onBootanimationExit\n");return Void();
}Return<void> ImwManager::onBootCompleted()
{ALOGW("onBootCompleted\n");return Void();
}Return<void> ImwManager::onReboot()
{ALOGW("onReboot\n");return Void();
}Return<void> ImwManager::onRecovery()
{ALOGW("onRecovery\n");return Void();
}Return<void> ImwManager::onSleep()
{ALOGW("onSleep\n");return Void();
}Return<void> ImwManager::onShutdown()
{ALOGW("onShutdown\n");return Void();
}ImwManager *ImwManager::sInstance = nullptr;}  // namespace implementation
}  // namespace V1_0
}  // namespace imw
}  // namespace hardware
}  // namespace isolution
}  // namespace vendor

添加rc文件:

rc 是 “runcom” 的缩写,这个术语最初来源于 Unix 系统,在早期的系统中使用了一个叫做 “runcom” 的目录,用于存放启动时需要运行的一些脚本和配置文件。

在实现了 serivce 和 impl 代码后需要添加 rc 文件,文件名为 vendor.isolution.hardware.imw@1.0-service.rc

service imw-hal-1-0 /vendor/bin/hw/vendor.isolution.hardware.imw@1.0-serviceclass haluser rootgroup root media system graphics input bluetooth shell drmrpc media_rw audio

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/19521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM之【运行时数据区1】

JVM简图 运行时数据区简图 一、程序计数器&#xff08;Program Counter Register&#xff09; 1.程序计数器是什么&#xff1f; 程序计数器是JVM内存模型中的一部分&#xff0c;它可以看作是一个指针&#xff0c;指向当前线程所执行的字节码指令的地址。每个线程在执行过程中…

Python魔法之旅-魔法方法(04)

目录 一、概述 1、定义 2、作用 二、主要应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类…

Tensorflow入门实战 P02-彩色图片分类

目录 1、序言 2、主要代码 3、运行结果展示 &#xff08;1&#xff09;展示cifar10里面的20张图片 &#xff08;2&#xff09;预测的图片 &#xff08;3&#xff09;模型评估 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K…

postgressql——ReadBuffer_common函数(7)

PostgreSQL中ReadBuffer_common函数 数据结构 BufferDesc 共享缓冲区的共享描述符(状态)数据 typedef struct BufferDesc {//buffer tagBufferTag tag; /* ID of page contained in buffer *///buffer索引编号(0开始)int buf_id; /* buffers i…

大语言模型(一)OLMo

一、简介 OLMo 是由AI2 发布的大语言模型以及构建框架,与大多数之前的尝试只发布模型权重和推理代码不同,OLMo 开源了整个框架,包括训练数据、训练代码以及模型评估代码。 OLMo框架包括构建和研究语言模型所需的工具和资源。对于训练和建模,它包括完整的模型权重、训练代…

SZJG-离线环境成功安装Python和pip

在离线环境下安装Python和pip&#xff0c;可以按照以下步骤进行。假设你已经下载了Python的安装包 (Python-3.10.13.tgz)。 步骤 1&#xff1a;准备安装包 将 Python-3.10.13.tgz 拷贝到目标机器上的一个目录中&#xff0c;例如 /home/user/。 步骤 2&#xff1a;解压安装包…

4万字长文让人看懂ElementUI面试题及参考答案

ElementUI是什么?请简述其主要特点。 ElementUI是一个基于Vue.js的桌面端组件库,由饿了么团队开发并维护。它旨在为开发人员提供一套用于构建网页应用程序的高质量UI组件。ElementUI遵循Vue.js的设计思想,使得开发者可以快速地构建出风格统一、功能丰富的界面。 主要特点:…

水经微图PC版4.3.10发布

让GIS更简单高效&#xff0c;让地图更丰富及时&#xff01; 水经微图&#xff08;以下简称“微图”&#xff09;新版已上线&#xff0c;在该版本中主要新增了天地图历史影像查看功能&#xff0c;以及其它功能的优化。 当前版本 当前版本号为&#xff1a;4.3.10 如果你发现该…

Pytorch反向传播算法(Back Propagation)

一&#xff1a;revise 我们在最开始提出一个线性模型。 x为我们的输入&#xff0c;w为权重。相乘的结果是我们对y的预测值。 那我们在训练时就是对这个权重w进行更新&#xff0c;就需要用到上一章提到的梯度下降算法&#xff0c;不断更新w。但是此时注意不是用y的预测值对w进…

linux centos nfs挂载两台服务器挂载统一磁盘目录权限问题

查看用户id id 用户名另一台为 修改uid和gid为相同id&#xff0c;添加附加组 usermod -u500 -Gwheel epms groupmod -g500 epms

网络协议。

一、流程案例 接下来揭秘我要说的大事情&#xff0c;“双十一”。这和我们要讲的网络协议有什么关系呢&#xff1f; 在经济学领域&#xff0c;有个伦纳德里德&#xff08;Leonard E. Read&#xff09;创作的《铅笔的故事》。这个故事通过一个铅笔的诞生过程&#xff0c;来讲述…

[代码复现]Self-Attentive Sequential Recommendation(ing)

参考代码&#xff1a;SASRec.pytorch 可参考资料&#xff1a;SASRec代码解析 前言&#xff1a;文中有疑问的地方用?表示了。可以通过ctrlF搜索’?。 环境 conda create -n SASRec python3.9 pip install torch torchvision因为我是mac运行的&#xff0c;所以device是mps 下面…

算法(七)插入排序

文章目录 插入排序简介代码实现 插入排序简介 插入排序&#xff08;insertion sort)是从第一个元素开始&#xff0c;该元素就认为已经被排序过了。然后取出下一个元素&#xff0c;从该元素的前一个索引下标开始往前扫描&#xff0c;比该值大的元素往后移动。直到遇到比它小的元…

Caliburn.Micro框架学习笔记——Action的参数传递机制

据此篇文章&#xff0c;我们继续来谈谈Caliburn.Mirco的Action参数传递机制。因此程序结构都是默认MVVM的形式。 基本机制 它的机制是—— Caliburn.Micro 的智能对象参数绑定机制通过约定和反射使得视图和视图模型之间的交互变得更加直观和简洁。通过 cal:Message.Attach 语…

【C语言】探索文件读写函数的全貌

&#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 &#x1f525;引言 本章将介绍文件读取函数的相关知识和展示使用场景&am…

vue中如何进行Markdown文档展示与解析

vue中如何进行Markdown文档展示与解析 一、安装插件二、如何使用 需求&#xff1a;接口返回了一个政策详情页面&#xff0c;里面有图片&#xff0c;用v-html展示的是url&#xff0c;所以改用vue-markdown 一、安装插件 npm install vue-markdown --save二、如何使用 <vue-…

RabbitMQ 如何保证消息不丢失

开启消息确认机制&#xff1a; 在发布消息时&#xff0c;可以设置deliveryMode为2&#xff08;持久化&#xff09;&#xff0c;以确保消息不会因为RabbitMQ的崩溃而丢失。 使队列持久化&#xff1a; 通过设置durable为true&#xff0c;可以确保队列在RabbitMQ重启后依然存在。…

Python 实战:打造智能进销存系统

想象一下&#xff0c;在繁忙的商店里&#xff0c;每天都有数以百计的商品进进出出&#xff0c;库存在不断变化&#xff0c;销售数据涌入&#xff0c;而你却能轻松应对一切。是的&#xff0c;Python 可以帮你实现这一切。本文将教你如何使用 Python 构建一个智能的进销存系统&am…

学习记录-5.30

学习记录-5.30 同步在我的博客可以来看看 http://www.zhihuigou.top/ ### Golang为什么比别的语言跟擅长并发: 首先是因为Goroutine&#xff0c;算是go的一个最大的特色 是轻量级的线程,创建一个goroutine的开销非常小,大约几KB,且调度开销很低 并且goroutine的调度,并不…

React组件通信——兄弟组件

兄弟组件通信 方法一&#xff1a;状态提升 子组件先将数据传递到父组件&#xff0c;父组件再把数据传到另一个子组件中。 import { useState } from "react"; // 定义A组件&#xff0c;向B组件发送数据 function A({ onGetMsg }) {const name "this is A na…