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 的异步回调。
注意:
对于 1.0 版软件包 android.hardware.foo
中的接口 IFooCallback
,您可以按照以下步骤用 Java 实现接口。
/tmp/android/hardware/foo/IFooCallback.java
作为参考。android.hardware.foo.V1_0.IFooCallback.Stub
,然后编写一个新类以对其进行扩展,并实现抽象方法。要查看自动生成的文件,请运行以下命令:
hidl-gen -o /tmp -Ljava \
-randroid.hardware:hardware/interfaces \
-randroid.hidl:system/libhidl/transport [email protected]
这些命令会生成目录 /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);
相关文章:
Android Treble 简介
Android HIDL 详解
Android HIDL 中 hidl-gen使用
Android HIDL 实例
Android HIDL 编程规范
Android HIDL 接口和软件包使用
Android HIDL 中的函数
Android HIDL 中的数据类型