版权声明:本文为博主原创文章,转载请带出处。 https://blog.csdn.net/hejianhua1/article/details/80549770
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, 相应的改动调用文件的代码。 然后就可以正常通信了。