HIDL接口定义

创建hidl目录

在aosp中的hardware/interfaces目录下创建自己的hal目录

mkdir -p hardware/interfaces/qmiller/1.0/default

创建hal文件

在我们刚才创建的hardware/interfaces/qmiller/1.0/目录下新建IQmiller.hal文件,传入string name,返回string类型的result。

package android.hardware.qmiller@1.0;interface IQmiller {helloWorld(string name) generates (string result);};

生产HAL文件

使用hidl-gen工具来处理IQmiller.hal文件,这里可以写成一个shell脚本。

PACKAGE=android.hardware.qmiller@1.0
LOC=hardware/interfaces/qmiller/1.0/default/
make hidl-gen -j4
hidl-gen -o $LOC -Lc++-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport $PACKAGE
hidl-gen -o $LOC -Landroidbp-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport $PACKAGE

此时的文件树:

hardware/interfaces/qmiller/1.0/
├── default
│   ├── Android.bp
│   ├── Qmiller.cpp
│   └── Qmiller.h
└── IQmiller.hal

然后使用脚本来更新Makefile,自动生成Android,mk, Android.bp

./hardware/interfaces/update-makefiles.sh

此时的文件树:

hardware/interfaces/qmiller/1.0/
├── Android.bp
├── default
│   ├── Android.bp
│   ├── Qmiller.cpp
│   └── Qmiller.h
└── IQmiller.hal

新建两个空文件:

touch hardware/interfaces/qmiller/1.0/default/android.hardware.qmiller@1.0-service.rc
touch hardware/interfaces/qmiller/1.0/default/service.cpp

实现HAL的implementation库

自动生成的Qmiller.h文件,这里介绍的是绑定式HAL,而不是直通式。

#pragma once#include <android/hardware/qmiller/1.0/IQmiller.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>namespace android::hardware::qmiller::implementation {using ::android::hardware::hidl_array;
using ::android::hardware::hidl_memory;
using ::android::hardware::hidl_string;
using ::android::hardware::hidl_vec;
using ::android::hardware::Return;
using ::android::hardware::Void;
using ::android::sp;struct Qmiller : public V1_0::IQmiller {// Methods from ::android::hardware::qmiller::V1_0::IQmiller follow.Return<void> helloWorld(const hidl_string& name, helloWorld_cb _hidl_cb) override;// Methods from ::android::hidl::base::V1_0::IBase follow.};// FIXME: most likely delete, this is only for passthrough implementations
// extern "C" IQmiller* HIDL_FETCH_IQmiller(const char* name);}  // namespace android::hardware::qmiller::implementation

自动生成的Qmiller.cpp


#include "Qmiller.h"namespace android::hardware::qmiller::implementation {// Methods from ::android::hardware::qmiller::V1_0::IQmiller follow.
Return<void> Qmiller::helloWorld(const hidl_string& name, helloWorld_cb _hidl_cb) {// TODO implementreturn Void();
}// Methods from ::android::hidl::base::V1_0::IBase follow.//IQmiller* HIDL_FETCH_IQmiller(const char* /* name */) {//return new Qmiller();
//}
//
}  // namespace android::hardware::qmiller::implementation

修改Android.bp文件,将-impl改成-service,将cc_library_shared改成cc_library,在-service后面加上vendor名称。

cc_library {name: "android.hardware.qmiller@1.0-service-lzm",relative_install_path: "hw",vendor:true,// FIXME: this should be 'vendor: true' for modules that will eventually be// on AOSP.proprietary: true,srcs: ["Qmiller.cpp",],shared_libs: ["libhidlbase","libutils","android.hardware.qmiller@1.0",],
}

实现service.cpp

#define LOG_TAG   "android.hardware.qmiller@1.0-service-lzm"
#include &lt;hidl/HidlLazyUtils.h&gt;
#include &lt;hidl/HidlSupport.h&gt;
#include &lt;hidl/HidlTransportSupport.h&gt;
#include "Qmiller.h"using ::android::OK;
using ::android::sp;
using ::android::hardware::configureRpcThreadpool;
using ::android::hardware::joinRpcThreadpool;
using ::android::hardware::LazyServiceRegistrar;
using ::android::hardware::qmiller::V1_0::IQmiller;
using ::android::hardware::qmiller::V1_0::implementation::Qmiller;int main(int argc, char* []) {sp<IQmiller> qmiller = new Qmiller;configureRpcThreadpool(1, true);auto registrar = LazyServiceRegistrar::getInstance();if (registrar.registerService(qmiller) != OK) {ALOGE("Could not register service.");return 1;}joinRpcThreadpool();ALOGE("Service exited!");return 1;
}

修改Android.bp

cc_library {name: "android.hardware.qmiller@1.0-service-lzm",relative_install_path: "hw",vendor:true,// FIXME: this should be 'vendor: true' for modules that will eventually be// on AOSP.proprietary: true,srcs: ["Qmiller.cpp",],shared_libs: ["libhidlbase","libutils","android.hardware.qmiller@1.0",],
}
cc_binary{name: "android.hardware.qmiller@1.0-service",defaults: ["hidl_defaults"],relative_install_path: "hw",proprietary: true,srcs: ["service.cpp"],init_rc: ["android.hardware.qmiller@1.0-service.rc"],shared_libs: ["libhidlbase","libhidltransport","libutils","liblog","libhardware","android.hardware.qmiller@1.0","android.hardware.qmiller@1.0-service-lzm",],
}

实现Qmiller.cpp文件

#include "Qmiller.h"
namespace android::hardware::qmiller::implementation {Return<void> Qmiller::helloWorld(const hidl_string& name, helloWorld_cb _hidl_cb) {char buf[100];::memset(buf, 0x00, 100);::snprintf(buf, 100, "Hello World, %s", name.c_str());hidl_string result(buf);_hidl_cb(result);return Void();}} // namespace android::hardware::qmiller::implementation

编译hal

mmm hardware/interfaces/qmiller/1.0/default/

最终会生成一个android.hardware.qmiller@1.0-service-lzm.so, 生成在/vendor/lib64/hw/下。

service.rc

service.cpp会被编译成bin文件,我们需要在系统启动的时候将我们编写的hal服务加进系统。android.hardware.qmiller@1.0-service.rc文件内容如下:

service qmiller_hal_service /vendor/bin/hw/android.hardware.qmiller@1.0-serviceclass haluser systemgroup system

为了让服务器被客户端访问到,还需要在device/xxx/xxx/manifest.xml(不同厂商路径不同)添加如下:

<hal format="hidl"><name>android.hardware.qmiller</name><transport>hwbinder</transport><impl level="generic"></impl><version>1.0<version><interface><name>IQmiller</name><instance>default</instance></interface>
</hal>

嵌入式实践教程--Android HAL自定义HAL代码教程相关推荐

  1. flex+android+教程,android开发flex4.5入门教程.pdf

    android开发flex4.5入门教程 中国矿业大学教务部 教务通知(2013 )第33 号 关于做好各级"大学生创新训练计划" 项目中期检查和结题验收的通知 各学院: 为加强我 ...

  2. android的webView的教程,Android WebView 应用界面开发教程

    WebView组件本身就是一个浏览器实现,Android5.0增强的WebView基于Chromium M37,直接支持WebRTC.WebAudio.WebGL.开发者可以直接在WebView中使用 ...

  3. python函数自定义教程_Python中自定义函数的教程

    在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 我们以自定义一个求绝对值的my_abs函数 ...

  4. android+客户端+教程,Android新浪客户端开发教程完整版.pdf

    Android新浪客户端开发教程完整版 Android 新浪客户端开发教程新浪客户端开发教程 (完整版(完整版)) 新浪客户端开发教程新浪客户端开发教程 ((完整版完整版)) android开发我的新 ...

  5. 帝国cms php调用字段,帝国cms模板教程之栏目自定义字段调用教程及代码

    首先说一下,我这里用的到带模板的栏目导航标签(showclasstemp),用其它标签需要修改其它函数,但我相信万变不离其中,原理都是一样的,为了让大家学会这个东东,我就从简单的开始说起 一.首先点模 ...

  6. android微信自定义分享代码,android 调用本地微信自定义多图分享朋友圈,可放在share sdk中一起使用...

    最终的效果图,右下角微信多图为自定义调用系统分享,分享到微信. 在你能正常调用share sdk的时候想在原本的基础上加自定义的分享非常的简单. 它的官网已经给出了代码,但是给的不是很清楚. lz毕竟 ...

  7. Android Studio自定义模板代码

    http://blog.csdn.net/h183288132/article/details/51916399 生成模板看上面这个博客就可以了,不再重复制造轮子. 不过需要补充的是: 还应该有下面的 ...

  8. android ndk 界面开发教程,Android NDK开发之入门教程

    JNI(Java Native Interface, Java本地化方法)使得Java能与其它语言(如C.C++)的动态库进行交互. 在Android 项目中,经常看到地图,统计,推送之类的第三方平台 ...

  9. android导航使用教程,android BottomNavigationView的简单使用教程

    每个android app都有BottomNavigationView导航,本人开发中刚刚使用到了BottomNavigationView,于是按照android developer官网特意做了一个符 ...

  10. ps切图教程 android,Cutterman切图简单教程,小白最爱的切图攻略

    目前很多手机app设计师都在使用Cutterman工具进行切图,因为这个软件是国内的软件,切图也必将方便.也提供了3个平台的切图方式.最新的Cutterman切图插件如下图: IOS: 如果你是为Ip ...

最新文章

  1. Uncaught ReferenceError: angular is not defined
  2. Mysql 导入导出csv 中文乱码问题的解决方法
  3. Python 处理带中文 Excel 文件
  4. 计算机简单游戏有什么用,简单又好玩的互动游戏 简单又好玩的互动游戏有哪些...
  5. Django框架(9.Django中的配置使用MySQL数据库以及页面重定向)
  6. git 只commit不push 会有影响吗_规范化团队 git 提交信息
  7. android 视频开发sd卡,Android开发之SD卡文件操作分析
  8. wdnas群晖nas_西数WD NAS红盘 WD140EFFX 14TB HDD和 SA500 1TB SSD开箱拆解评测
  9. Java基础学习总结(85)——Java中四种线程安全的单例模式实现方式
  10. echarts echarts.js:440 Uncaught TypeError: Cannot read properties of null (reading ‘toFixed‘)
  11. 六月福师计算机应用基础在线作业,19春福师《计算机应用基础》在线作业一答案满分...
  12. 六合一多功能串口模块
  13. MyBatisCodeHelper-Pro插件
  14. 【QMT之xtquant】活用xtdata,激活download_history_data2批量高效获取行情数据
  15. android 应用图标 角标 显示未读消息
  16. Nginx更新文件后不生效
  17. 算法训练 子网掩码(25分)c++实现
  18. Unity下的UDP客户端
  19. 注册会计师,【会计科目】考试经验,另附一些整理好的网课,东奥,中华
  20. 功能连接方法及其在fMRI数据中的应用

热门文章

  1. 阴阳师夜刀神技能是什么
  2. 【数模之数据分析-2】
  3. 服务器c盘里面哪些是临时文件,别再让你系统产生的大量临时文件占用C盘了的方法...
  4. python获取图像灰度极值点_opencv-python读取tiff影像上任意点的灰度值和RBG值
  5. 存储组件之MFS详解
  6. 企业运维实战--MFS分布式文件系统
  7. 【历史上的今天】11 月 21 日:第一个阿帕网连接建立;乐视网成立;爱迪生发明留声机
  8. storm风暴英雄 tempo_【风暴英雄】锐派专区 - fb.replays.net | 风暴英雄官网合作中文站...
  9. android二维码图片生成模糊的问题
  10. Python如何批量把图片地址输入到浏览器上