前言:

HIDL 接口主要通过本机代码使用,因此 HIDL 专注于自动生成高效的 C++ 代码。不过,HIDL 接口也必须能够直接通过 Java 使用,因为有些 Android 子系统(如 Telephony)很可能具有 Java HIDL 接口。本文介绍了 HIDL 接口的 Java 前端,详细说明了如何创建、注册和使用服务,以及使用 Java 编写的 HAL 和 HAL 客户端如何与 HIDL RPC 系统进行交互。

 

作为客户端:

以HelloWorld 为例(详细看Android HIDL 实例 一文),需要将hidl 的java 库导入,在Android.mk 中添加:

LOCAL_JAVA_LIBRARIES := \                                                                               android.hardware.helloworld-V1.0-java

添加代码:

    private void test() {        IHelloWorld service = null;        try {            service = IHelloWorld.getService(true);        } catch (RemoteException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        if (service == null) {            Log.e(TAG, "test failed, service is null...");        }    }

注意:不含参数的 Java getService 将不会等待服务启动。

 

作为服务端:

Java 中的框架代码可能需要提供接口才能接收来自 HAL 的异步回调。

注意

  • 请勿用 Java 实现驱动程序 (HAL)。我们强烈建议您用 C++ 实现驱动程序。
  • Java 驱动程序必须与其客户端处于不同的进程中(不支持同一进程通信)。

对于 1.0 版软件包 android.hardware.foo 中的接口 IFooCallback,您可以按照以下步骤用 Java 实现接口。

  1. 用 HIDL 定义您的接口。
  2. 打开 /tmp/android/hardware/foo/IFooCallback.java 作为参考。
  3. 为您的 Java 实现创建一个新模块。
  4. 检查抽象类 android.hardware.foo.V1_0.IFooCallback.Stub,然后编写一个新类以对其进行扩展,并实现抽象方法。

查看自动生成的文件

要查看自动生成的文件,请运行以下命令:

hidl-gen -o /tmp -Ljava \  -randroid.hardware:hardware/interfaces \  -randroid.hidl:system/libhidl/transport android.hardware.foo@1.0

这些命令会生成目录 /tmp/android/hardware/foo/1.0。对于文件 hardware/interfaces/foo/1.0/IFooCallback.hal,这会生成文件 /tmp/android/hardware/foo/1.0/IFooCallback.java,其中包含 Java 接口、代理代码和存根(代理和存根均与接口吻合)。

-Lmakefile 会生成在构建时运行此命令的规则,并允许您包含 android.hardware.foo-V1.0-java 并链接到相应的文件。您可以在 hardware/interfaces/update-makefiles.sh 中找到自动为充满接口的项目执行此操作的脚本。 本示例中的路径是相对路径;硬件/接口可能是代码树下的一个临时目录,让您能够先开发 HAL 然后再进行发布。

 

运行服务

HAL 提供了一个接口 IFoo,它必须通过接口 IFooCallback 对框架进行异步回调。IFooCallback 接口不按名称注册为可检测到的服务;相反,IFoo 必须包含一个诸如 setFooCallback(IFooCallback x) 的方法。

要通过软件包 android.hardware.foo 版本 1.0 设置 IFooCallback,请将 android.hardware.foo-V1.0-java 添加到 Android.mk 中。运行服务的代码为:

import android.hardware.foo.V1_0.IFoo;import android.hardware.foo.V1_0.IFooCallback.Stub;....class FooCallback extends IFooCallback.Stub {    // implement methods}....// Get the service you will be receiving callbacks from.// This also starts the threadpool for your callback service.IFoo server = IFoo.getService(true /* retry */); // throws NoSuchElementException if not available....// This must be a persistent instance variable, not local,//   to avoid premature garbage collection.FooCallback mFooCallback = new FooCallback();....// Do this once to create the callback service and tell the "foo-bar" serviceserver.setFooCallback(mFooCallback);

 

 

 

 

相关文章:

Android Treble 简介

Android HIDL 详解

Android HIDL 中 hidl-gen使用

Android HIDL 实例

Android HIDL 编程规范

Android HIDL 接口和软件包使用

Android HIDL 中的函数

Android HIDL 中的数据类型

 

更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. 一款常用的 Squid 日志分析工具
  3. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  4. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  5. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  6. Android学习笔记(三)-第一个Android应用HelloWorld
  7. [置顶] android 如何在自定义对话框中获取edittext中的数据
  8. Android(安卓)Studio 的四种打包方式
  9. Android实现可使用自定义透明Dialog样式的Activity完整实例

随机推荐

  1. 兼容各个浏览器唤起下载APP
  2. Android 获取手机网络状态
  3. Android中Bitmap, Drawable, Byte之间的
  4. Android入门:HTML布局中Android程序与JAVA
  5. Android(安卓)启动Activity两个属性 .MAI
  6. android 通过地址获取经纬度
  7. android crosswalk-webview 取代 webview
  8. android studio 中使用gradle.properties
  9. android 系统数据库
  10. android中自定义Button,设置不同背景图片