android aidl-cpp方式接口调用出现问题
16lz
2022-07-23
android aidl-cpp方式:
java client 端调用接口: return mPoiGateWayService.hasHomeLocation();
C++ service端实现接口:
Status hasHomeLocation(bool* _aidl_return) override {
ALOGI("Entering hasHomeLocation");
*_aidl_return = true;
return Status::ok();
}
aidl 声明的接口: boolean hasHomeLocation();
问题:为啥java端接口调用的时候报错: I apkPoiTest: call cns hasHomeLocation fail: java.lang.IllegalArgumentException
java client 端调用接口: return mPoiGateWayService.hasHomeLocation();
C++ service端实现接口:
Status hasHomeLocation(bool* _aidl_return) override {
ALOGI("Entering hasHomeLocation");
*_aidl_return = true;
return Status::ok();
}
aidl 声明的接口: boolean hasHomeLocation();
问题:为啥java端接口调用的时候报错: I apkPoiTest: call cns hasHomeLocation fail: java.lang.IllegalArgumentException
root cause:
由于PoiService.aidl 这个文件前面没有加I (标准的应该是IPoiService.aidl), 导致 java端aidl自动生成的的java文件 描述符 和 C++端自动生成cpp文件的描述符 不一样 (cpp这边会自动加上个I, 而java端不会自动加上I)。 造成两个进程无法通信。 这个错误是java, cpp的aidl自动生成代码工具处理方法不一致导致。我们人为不能去处理的, 还是要客户把aidl文件按照标准写法写,接口文件前面都要统一加上I才行。
cpp端自动生成的:
IMPLEMENT_META_INTERFACE(PoiService, "android.poi.IPoiService")
java端自动生成的:
private static final java.lang.String DESCRIPTOR = "android.poi.PoiService";
名字不一样,所以无法正常进行通信。
把接口文件前面加上I, 相应的改动调用文件的代码。 然后就可以正常通信了。
更多相关文章
- NPM 和webpack 的基础使用
- 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
- 读取android手机流量信息
- android 使用html5作布局文件: webview跟javascript交互
- Android(安卓)Wifi模块分析(三)
- Android(安卓)多媒体扫描过程(Android(安卓)Media Scanner Proces
- android“设置”里的版本号
- Android中dispatchDraw分析
- Android开发环境搭建