天天看点

AWTK 在 Android 平台实现跨进程服务调用

AWTK 在 Android 平台实现跨进程服务调用

前几天,有朋友想在 AWTK 的应用程序中,调用打印机提供的服务,去打印采集到的数据。打印机本身有一个 APP,它提供了一个对外的服务,并附带一个 AIDL 文件。

要说这个东西本身也不难,但是要在 AWTK 应用程序中,通过 C 语言函数去调用 java 的函数,再通过 java 的函数去调用另外一个进程的服务,对于只会 C 语言的嵌入式程序员来说,不懂 java 也不懂 android,还绕了几个大弯,那确实太难了。

这里用一个 FooBar 的服务,演示一下整个开发过程,供有需要的童鞋参考。

先用 Android Studio 新建一个普通的 Android Java 项目 FooBarServer。

文件位置:app/src/main/aidl/org/zlgopen/foobarserver/IFooBarService.aidl

为了方便说明,这里只是提供了一个 add 函数,输入 a 和 b 两个参数,返回两者之和。

文件位置:app/src/main/java/org/zlgopen/foobarserver/FooBarService.java

要跨进程调用,这行代码很关键:android:process=":remote"

为了验证服务端的正确性,我们再用 Android Studio 创建一个普通的 Android Java 应用程序 FooBarClient。

把 app/src/main/aidl/org/zlgopen/foobarserver/IFooBarService.aidl 从 FooBarService 拷贝到 FooBarClient 下,并保持目录结构不变。

建立与服务的连接,并调用相应的函数。

编译并安装 FooBarServer 和 FooBarClient。

AWTK 的 UI 线程和 Android 的 Activity 线程并不是同一个,所以 AWTK 的插件全部是异步接口,调用完成后通过回调函数返回执行结果。

参数和返回值都使用 JSON 格式的字符串。

实现很简单:把参数打包成 JSON 格式的字符串,再用 platform_request_send 发送给插件管理器,由插件管理器负责把请求转发给插件。

文件位置:src/foobar/android/java/org/zlgopen/plugins/foobar/FooBarPlugin.java

插件负责建立与服务之间的连接,并将 AWTK C API 发送过来的请求,转发给 FooBarServer。

建立连接的过程与 FooBarClient 类似,只是由于 Plugin 不是 Activity,如果要调用 Activity 的函数,需要通过 this.activity 调用。

run 函数负责处理来自 AWTK C API 的请求,并转发给 FooBarServer:

包含头文件

调用函数并显示结果

完整代码请参考 awtk-mobile-plugins