创建一个Android HIDL 实例_fly2700的博客-程序员宅基地_android hidl 实例

技术标签: c++  android  测试工具  Android  

本文中Helloworld 位于hardware/interfaces中,所以目录路径为hardware/interfaces/helloworld/1.0。

cd ./hardware/interfaces/helloworld/1.0

创建文件IHelloWorld.hal

package [email protected];
 
interface IHelloWorld {
    justTest(string name) generates (string result, HelloTest value);
 
    justTest1(HelloTest name);
};

创建文件:types.hal

package [email protected];
 
enum HelloTest : uint8_t {
    V_TEST1 = 0,
    V_TEST2 = 1,
};

自动生成.bp文件的命令:

source ./build/envsetup.sh 
lunch
./hardware/interfaces/update-makefiles.sh 

用hidl-gen生成空.cpp文件,

#! /bin/bash
 
[email protected]
LOC=hardware/interfaces/helloworld/1.0/default/
 
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

保存文件gen_cpp.sh,运行gen_cpp.sh后产生default目录和.cpp .h .bp文件,其中cpp文件就是我们需要实现的。
  
编辑.cpp文件,修改如下:

#define LOG_TAG "HelloWorldImpl"

#include <log/log.h>

#include "HelloWorld.h"

namespace android {
namespace hardware {
namespace helloworld {
namespace V1_0 {
namespace implementation {

// Methods from ::android::hardware::helloworld::V1_0::IHelloWorld follow.
Return<void> HelloWorld::justTest(const hidl_string& name, justTest_cb _hidl_cb) {
ALOGD("justTest, name = %s", name.c_str());

    _hidl_cb(name, HelloTest::V_TEST2);
    ALOGD("justTest end.");
        return Void();
}

Return<void> HelloWorld::justTest1(::android::hardware::helloworld::V1_0::HelloTest name) {
    ALOGD("justTest1, name = %hhu", name);
        return Void();
}


// Methods from ::android::hidl::base::V1_0::IBase follow.

IHelloWorld* HIDL_FETCH_IHelloWorld(const char* name) {
    ALOGD("FETCH IHelloWorld: %s", name);
    if (name != nullptr)
        return new HelloWorld();
    else
        return nullptr;
}
//
}  // namespace implementation
}  // namespace V1_0
}  // namespace helloworld
}  // namespace hardware
}  // namespace android

创建service.cpp

#define LOG_TAG "[email protected]"
 
#include <android/hardware/helloworld/1.0/IHelloWorld.h>
 
#include <hidl/LegacySupport.h>
#include "HelloWorld.h"
 
// Generated HIDL files
using android::hardware::helloworld::V1_0::IHelloWorld;
using android::hardware::helloworld::V1_0::implementation::HelloWorld;
 
using android::hardware::defaultPassthroughServiceImplementation;
using android::hardware::configureRpcThreadpool;
using android::hardware::joinRpcThreadpool;
 
int main() {
#if 1
    return defaultPassthroughServiceImplementation<IHelloWorld>();
#else
    sp<IHelloWorld> service = new HelloWorld();
    configureRpcThreadpool(1, true /*callerWillJoin*/);
    if(android::OK !=  service->registerAsService())
        return 1;
    joinRpcThreadpool();
#endif
} 

修改Android.bp

cc_library_shared {
    name: "[email protected]",
    relative_install_path: "hw",
    proprietary: true,
    srcs: [
        "HelloWorld.cpp",
    ],
    shared_libs: [
        "liblog",
        "libhidlbase",
        "libhidltransport",
        "libutils",
        "[email protected]",
    ],
}

cc_binary {
    name: "[email protected]",
    defaults: ["hidl_defaults"],
    relative_install_path: "hw",
    vendor: true,
    init_rc: ["[email protected]"],
    srcs: [
        "HelloWorld.cpp",
        "service.cpp"
    ],
    shared_libs: [
        "liblog",
        "libhidlbase",
        "libhidltransport",
        "libutils",
        "libhardware",
        "[email protected]",
    ],
}

创建[email protected]

service helloworld-hal-1-0 /vendor/bin/hw/[email protected]
    class hal
    user system
    group system

编译可执行二进制:
mmm hardware/interfaces/helloworld/1.0/default/

生成.so文件:
out/target/product/lime/system/lib64/vndk-29/[email protected]
out/target/product/lime/vendor/lib64/hw/[email protected]

生成可执行文件:
out/target/product/lime/vendor/bin/hw/[email protected]
启动脚本:
out/target/product/lime/vendor/etc/init/[email protected]

--------------------------------------------------------------------------------------------------

到此,服务、.so库文件、都已经编译完成,下面开始客户端的调用的实现

---------------------------------------------------------------------------------------------------
创建直通模式客户端 client.cpp:(default目录)

#include <android/hardware/helloworld/1.0/IHelloWorld.h>
#include <hidl/Status.h>
#include <hidl/LegacySupport.h>
#include <utils/misc.h>
#include <hidl/HidlSupport.h>
#include <stdio.h>

using android::hardware::helloworld::V1_0::IHelloWorld;
using android::sp;
using android::hardware::hidl_string;

int main()
{
    int ret = 0;
    android::sp<IHelloWorld> service = IHelloWorld::getService();
    if(service == nullptr) {
        printf("Failed to get service\n");
        ret = -1;
        return ret;
    }
    ::android::hardware::helloworld::V1_0::HelloTest name = {};
    service->justTest1(name);

    return ret;
}

创建Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_PROPRIETARY_MODULE := true
LOCAL_MODULE := helloworld_client
LOCAL_SRC_FILES := \
    client.cpp \
 
LOCAL_SHARED_LIBRARIES := \
   liblog \
   libhidlbase \
   libutils \
   an[email protected] \
 
include $(BUILD_EXECUTABLE)

编译可执行二进制:
mmm hardware/interfaces/helloworld/1.0/default/
生成文件:
out/target/product/lime/vendor/bin/helloworld_client

将vendor烧到手机上后,可直接运行helloworld_client。

参考文章:

Android HIDL 实例_私房菜-程序员宅基地_hidl_interface

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fly2700/article/details/119889680

智能推荐

python in memory_python 内存监控模块之memory_profiler_weixin_39980841的博客-程序员宅基地

0. memory_profiler是干嘛的This is a python module for monitoring memory consumption of a process as well as line-by-line analysis of memory consumption for python programs. It is a pure python module and ...

彭彭的第一篇博客_weixin_41144112的博客-程序员宅基地

方正璞华面试总结1.final、finally、finalize的区别?1、final修饰符(关键字)。被final修饰的类,就意味着不能再派生出新的子类,不能作为父类而被子类继承。因此一个类不能既被abstract声明,又被final声明。将变量或方法声明为final,可以保证他们在使用的过程中不被修改。被声明为final的变量必须在声明时给出变量的初始值,而在以后的引用中只能读取。被fin...

docker相关指令_shark_go的博客-程序员宅基地

docker相关命令1、镜像镜像加速nano /etc/docker/daemon.json{ "registry-mirrors": [ "https://hub-mirror.c.163.com", "https://mirror.baidubce.com" ]}# 重启服务systemctl daemon-reloadsystemctl restart docker获取镜像docker pull [选项] [Docker Regis.

python for if语句_带有if语句的Python for循环_落云歌语文的博客-程序员宅基地

该代码将用于附加了栅格像元计数的面数据。例如,如果栅格是土地覆盖,则每个土地覆盖类型都会有一列,并且每个多边形内会有对应的像元计数。此输出来自地理空间建​​模环境,因为制表栅格一直使我正在使用的大型shapefile崩溃。最终,我想要一个面积值,而不是一个单元格数,这是下面的代码将实现的。因此,代码将遍历shapefile属性,提取原始计数字段,然后根据用户输入创建新字段(使用用户输入名称+栅格值...

C#版本的MyBatis( C#解析XML文件并且获取SQL语句)_阿龙学堂的博客-程序员宅基地

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Xml;namespace Common{    ///     /// 读取SQLConfig文件中的SQL    ///     public  class Sq

二级c语言努力学可以过吗,考过计算机二级C语言一些感想和建议_sadeir的博客-程序员宅基地

计算机二级C语言1、计算机二级C语言难吗?我自我感觉吧,还好如果你的思维逻辑够清楚,对于小白来说看懂基本上就稳了2、计算机复习需要多久?我建议最多2个月(基础很差的那种),一般复习个1个月是稳的3、计算机二级复习需要哪些资料自我建议把那个未来教育的二级题库刷一般就可以了,基本上考的都是原题,偶尔几题多记记即可4、考计算机二级有啥用?说实话我也不太清楚,但有总比没有强吧,还能证明你在学习里并没虚度时...

随便推点

SpringMvc上传文件抛出3次MaxUploadSizeExceededException 问题_weixin_34346099的博客-程序员宅基地

SpringMvc 3.2.18 版本开发的文件上传在Tomcat7 上运行抛出了3个MaxUploadSizeExceededException 异常; 正常情况下 当上传文件大小超过允许的大小时SpirngMvc 会抛出一个MaxUploadSizeExceededException 异常 如下 2018-02-25 23:05:15 WARN http-bio-8080-exec-5 [Co...

github初次使用介绍_weixin_30338481的博客-程序员宅基地

##############################################################################Git和GitHub的区别GitHub术语解析配置使用注册GitHub帐号创建Git创建库复制库社交化#############...

服务注册与发现服务:Eureka与ZooKeeper的区别_程序员的程序媛的博客-程序员宅基地

著名的CAP理论指出,一个分布式系统不可能同时满足C(consistence 一致性),A(applicability 可用性),P(Partition分区容错性),由于分区容错性在分布式系统中是必须要考虑的,因此我们只能造C和A之前进行权衡。在此,zookeeper保证的是CP,eureka保证的是AP。Zookeeper保证CP    当注册中心查询服务列表时,我们可以容忍注册中心返回的...

excel自动生成UUID_WenMangZhu的博客-程序员宅基地_excel 生成uuid

excel自动生成UUID公式=CONCATENATE(IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),IF

Power bi 4.1 阿斯特图_程志伟的博客-程序员宅基地

关注微信公共号:小程在线关注程序员宅基地:程志伟的博客数据集链接见微信公共号底端 1.在Power BI中导入阿斯特图可视化效果, 点击… 选择导入自定义视觉对象,点击导入。 2. 选择我们需要导入的视觉对象。 3. 在可视化就会出现新的图形。 4. 导入“AsterPlot.csv”数据。 5.单击“可视化”窗格中的“阿斯特图”图标, 在画布区域会出现该图的模板, 由于没有填入数据, 因此图是灰色的。...

长时间未关闭hadoop集群导致stop-all.sh 失效_青+蓝=紫的博客-程序员宅基地

如果长时间未关闭hadoop集群,执行stop-all.sh命令会报错:no DataNode/NameNode to stop。这是因为hadoop启动时的默认地址为:export HADOOP_PID_DIR=${HADOOP_PID_DIR}即存放log的地址(/tmp),在启动时可以看到starting datanode, logging to /hadoop/hadoop-2.7.7...

推荐文章

热门文章

相关标签