android获取service对象_JAVA层HIDL服务的获取原理Android10.0 HwBinder通信原理(九)

本文详细介绍了Android10.0中JAVA层HIDL服务的获取流程,包括通过JNI接口、HwServiceManager、HIDL服务的注册与查找,以及HwBinder的通信机制。
摘要由CSDN通过智能技术生成

阅读本文大约需要花费19分钟。

原创不易,如果您觉得有点用,希望可以随手转发或者点击右下角的 “在看”、“”分享“”,拜谢!

《Android取经之路》系列文章:

《系统启动篇》

Android取经之路——启动篇

Android系统架构

Android是怎么启动的

Android系统启动之init进程(一)

Android系统启动之init进程(二)

Android 10.0系统启动之init进程(三)

Android 10.0系统启动之init进程(四)

Android 10.0系统启动之Zygote进程(一)

Android 10.0系统启动之Zygote进程(二)

Android 10.0系统启动之Zygote进程(三)

Android 10.0系统启动之Zygote进程(四)

Android 10.0系统启动之SystemServer进程(一)

Android 10.0系统启动之SystemServer进程(二)

Android 10.0系统服务之AMS启动流程

Android 10.0系统启动之Launcher(桌面)启动流程

Android 10.0应用进程创建过程以及Zygote的fork流程

Android 10.0 PackageManagerService(一)工作原理及启动流程

Android 10.0 PackageManagerService(二)权限扫描

Android 10.0 PackageManagerService(三)APK扫描

Android 10.0 PackageManagerService(四)APK安装流程

《日志系统》

Android10.0 日志系统分析(一)-logd、logcat 指令说明、分类和属性

Android10.0 日志系统分析(二)-logd、logcat架构分析及日志系统初始化

Android10.0 日志系统分析(三)-logd、logcat读写日志源码分析

Android10.0 日志系统分析(四)-selinux、kernel日志在logd中的实现

《Binder系列》

Android10.0 Binder通信原理(一)Binder、HwBinder、VndBinder概要

Android10.0 Binder通信原理(二)-Binder入门篇

Android10.0 Binder通信原理(三)-ServiceManager篇

Android10.0 Binder通信原理(四)-Native-C\C++实例分析

Android10.0 Binder通信原理(五)-Binder驱动分析

Android10.0 Binder通信原理(六)-Binder数据如何完成定向打击

Android10.0 Binder通信原理(七)-Framework binder示例

Android10.0 Binder通信原理(八)-Framework层分析

Android10.0 Binder通信原理(九)-AIDL Binder示例

Android10.0 Binder通信原理(十一)-Binder总结

《HwBinder系列》

HwBinder入门篇-Android10.0 HwBinder通信原理(一)

HIDL详解-Android10.0 HwBinder通信原理(二)

HIDL示例-C++服务创建Client验证-Android10.0 HwBinder通信原理(三)

HIDL示例-JAVA服务创建-Client验证-Android10.0 HwBinder通信原理(四)

HwServiceManager篇-Android10.0 HwBinder通信原理(五)

Native层HIDL服务的注册原理-Android10.0 HwBinder通信原理(六)

Native层HIDL服务的获取原理-Android10.0 HwBinder通信原理(七)

JAVA层HIDL服务的注册原理-Android10.0 HwBinder通信原理(八)

上一节,我们学习了JAVA层 HIDL服务的注册获取原理,这一节我们来看看JAVA层HIDL服务的获取原理。

5. 获取服务

  JAVA层HIDL服务获取如下图所示:

90f774ec0c6647b1f279358851dda53b.png

5.1 获取服务调用栈

5d2b3d097df196839ce38ab86d1c2902.png

5.2 onClick()

[/vendor/ingres/hidl_demo/app/src/main/java/com/android/hidldemo/MainActivity.java] private IDemo mHidlService;     public void onClick(View v) {
            switch (v.getId()) {
                case R.id.getHelloBtn:                Log.d(TAG, "start to click");                try {
                               //1.获取IDemo的hidl服务                    mHidlService = IDemo.getService();                    if (mHidlService == null) {
                            Log.e(TAG, "fail to get demo service");                    } else {
                            Log.d(TAG, "success to get demo service");                               //2.调用hidl接口                        String result =  mHidlService.getHelloString("IngresGe");                        Log.d(TAG, "HIDL return:" + result);                    }                } catch (RemoteException ex) {
                        Log.e(TAG, "exception, fail to get demo service");                }                break;        }    }

5.3 getService()

[/frameworks/base/core/java/android/os/HwBinder.java]public static native final IHwBinder getService(        String iface,        String serviceName,        boolean retry)    throws RemoteException, NoSuchElementException;

这是一个JNI接口,参考上一节《JAVA层HIDL服务的注册原理》中的JNI的转换,在JNI层,进入JHwBinder_native_getService()

5.4 JHwBinder_native_getService

[/frameworks/base/core/jni/android_os_HwBinder.cpp]static jobject JHwBinder_native_getService(        JNIEnv *env,        jclass /* clazzObj */,        jstring ifaceNameObj,        jstring serviceNameObj,        jboolean retry) {
        using ::android::hidl::base::V1_0::IBase;    using ::android::hardware::details::getRawServiceInternal;    std::string ifaceName;    {
            ScopedUtfChars str(env, ifaceNameObj);        if (str.c_str() == nullptr) {
                return nullptr;  // NPE will be pending.        }        ifaceName = str.c_str();    }    std::string serviceName;    {
            ScopedUtfChars s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值