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