Android HIDL 在Java 中使用

前言:
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 实现接口。

用 HIDL 定义您的接口。
打开 /tmp/android/hardware/foo/IFooCallback.java 作为参考。
为您的 Java 实现创建一个新模块。
检查抽象类 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" service
server.setFooCallback(mFooCallback);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Android应用程序使用HIDL服务,需要先了解HIDL服务的接口和功能。通常,HIDL服务会提供一个HIDL接口,该接口定义了与硬件模块通信的方法和功能。 下面是使用HIDL服务的一般步骤: 1. 包含HIDL服务的依赖:在应用程序的build.gradle文件,添加对包含HIDL服务的库的依赖项。例如,如果HIDL服务位于"com.example.hidl"包,可以添加以下依赖项: ```groovy implementation 'com.example.hidl:hidl-service:1.0' ``` 2. 获取HIDL服务的引用:在应用程序的代码使用ServiceManager来获取HIDL服务的引用。ServiceManager是Android系统的系统服务,它允许应用程序获取和管理系统的各种服务。 ```java import android.os.ServiceManager; // 获取HIDL服务的引用 IBaseHidlService hidlService = IBaseHidlService.getService(); ``` 3. 调用HIDL服务的方法:通过获取到的HIDL服务引用,可以调用其定义的方法来与硬件模块进行交互。 ```java // 调用HIDL服务提供的方法 hidlService.doSomething(); ``` 需要注意的是,具体的HIDL接口和方法名称会根据你所使用HIDL服务而有所不同。你需要查阅相关文档或源代码以了解具体的接口和方法定义。 此外,还需要确保在AndroidManifest.xml文件声明必要的权限和服务,以便应用程序可以访问HIDL服务。 总之,使用HIDL服务的关键是获取HIDL服务的引用,并调用其定义的方法来与硬件模块进行交互。具体的步骤和方法会根据你使用HIDL服务而有所不同,需要参考相关文档或源代码进行实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值