嵌入式实践教程--Android HAL自定义HAL代码教程
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 <hidl/HidlLazyUtils.h>
#include <hidl/HidlSupport.h>
#include <hidl/HidlTransportSupport.h>
#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代码教程相关推荐
- flex+android+教程,android开发flex4.5入门教程.pdf
android开发flex4.5入门教程 中国矿业大学教务部 教务通知(2013 )第33 号 关于做好各级"大学生创新训练计划" 项目中期检查和结题验收的通知 各学院: 为加强我 ...
- android的webView的教程,Android WebView 应用界面开发教程
WebView组件本身就是一个浏览器实现,Android5.0增强的WebView基于Chromium M37,直接支持WebRTC.WebAudio.WebGL.开发者可以直接在WebView中使用 ...
- python函数自定义教程_Python中自定义函数的教程
在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 我们以自定义一个求绝对值的my_abs函数 ...
- android+客户端+教程,Android新浪客户端开发教程完整版.pdf
Android新浪客户端开发教程完整版 Android 新浪客户端开发教程新浪客户端开发教程 (完整版(完整版)) 新浪客户端开发教程新浪客户端开发教程 ((完整版完整版)) android开发我的新 ...
- 帝国cms php调用字段,帝国cms模板教程之栏目自定义字段调用教程及代码
首先说一下,我这里用的到带模板的栏目导航标签(showclasstemp),用其它标签需要修改其它函数,但我相信万变不离其中,原理都是一样的,为了让大家学会这个东东,我就从简单的开始说起 一.首先点模 ...
- android微信自定义分享代码,android 调用本地微信自定义多图分享朋友圈,可放在share sdk中一起使用...
最终的效果图,右下角微信多图为自定义调用系统分享,分享到微信. 在你能正常调用share sdk的时候想在原本的基础上加自定义的分享非常的简单. 它的官网已经给出了代码,但是给的不是很清楚. lz毕竟 ...
- Android Studio自定义模板代码
http://blog.csdn.net/h183288132/article/details/51916399 生成模板看上面这个博客就可以了,不再重复制造轮子. 不过需要补充的是: 还应该有下面的 ...
- android ndk 界面开发教程,Android NDK开发之入门教程
JNI(Java Native Interface, Java本地化方法)使得Java能与其它语言(如C.C++)的动态库进行交互. 在Android 项目中,经常看到地图,统计,推送之类的第三方平台 ...
- android导航使用教程,android BottomNavigationView的简单使用教程
每个android app都有BottomNavigationView导航,本人开发中刚刚使用到了BottomNavigationView,于是按照android developer官网特意做了一个符 ...
- ps切图教程 android,Cutterman切图简单教程,小白最爱的切图攻略
目前很多手机app设计师都在使用Cutterman工具进行切图,因为这个软件是国内的软件,切图也必将方便.也提供了3个平台的切图方式.最新的Cutterman切图插件如下图: IOS: 如果你是为Ip ...
最新文章
- Uncaught ReferenceError: angular is not defined
- Mysql 导入导出csv 中文乱码问题的解决方法
- Python 处理带中文 Excel 文件
- 计算机简单游戏有什么用,简单又好玩的互动游戏 简单又好玩的互动游戏有哪些...
- Django框架(9.Django中的配置使用MySQL数据库以及页面重定向)
- git 只commit不push 会有影响吗_规范化团队 git 提交信息
- android 视频开发sd卡,Android开发之SD卡文件操作分析
- wdnas群晖nas_西数WD NAS红盘 WD140EFFX 14TB HDD和 SA500 1TB SSD开箱拆解评测
- Java基础学习总结(85)——Java中四种线程安全的单例模式实现方式
- echarts echarts.js:440 Uncaught TypeError: Cannot read properties of null (reading ‘toFixed‘)
- 六月福师计算机应用基础在线作业,19春福师《计算机应用基础》在线作业一答案满分...
- 六合一多功能串口模块
- MyBatisCodeHelper-Pro插件
- 【QMT之xtquant】活用xtdata,激活download_history_data2批量高效获取行情数据
- android 应用图标 角标 显示未读消息
- Nginx更新文件后不生效
- 算法训练 子网掩码(25分)c++实现
- Unity下的UDP客户端
- 注册会计师,【会计科目】考试经验,另附一些整理好的网课,东奥,中华
- 功能连接方法及其在fMRI数据中的应用
热门文章
- 阴阳师夜刀神技能是什么
- 【数模之数据分析-2】
- 服务器c盘里面哪些是临时文件,别再让你系统产生的大量临时文件占用C盘了的方法...
- python获取图像灰度极值点_opencv-python读取tiff影像上任意点的灰度值和RBG值
- 存储组件之MFS详解
- 企业运维实战--MFS分布式文件系统
- 【历史上的今天】11 月 21 日:第一个阿帕网连接建立;乐视网成立;爱迪生发明留声机
- storm风暴英雄 tempo_【风暴英雄】锐派专区 - fb.replays.net | 风暴英雄官网合作中文站...
- android二维码图片生成模糊的问题
- Python如何批量把图片地址输入到浏览器上