Android(安卓)源码环境下 C++通过aidl与java层系统服务通信
16lz
2021-01-26
Android aidl最终是通过c++实现,所以我们可以通过c++ 调用java层的系统服务。
首先我们需要一个继承自IInterface的代理接口类IXXXService:
class IXXXService : public IInterface{const String16 SERVICE_DESCRIPTOR("com.xxx.IXXXService");protected:enum{Fun1 = IBinder :: FIRST_CALL_TRANSACTION+ 0,};}
其中SERVICE_DESCRIPTOR对应着,Fun1对应着IXXXService.java里面的android.os.IBinder.FIRST_CALL_TRANSACTION + 0所代表的函数,我们不必实现所有IXXXService.java里面的函数。
接着我们根据这个接口创建一个BpINTERFACE类,并实现函数的调用:
class BpXXXService : public BpInterface{ ... Fun1(...){ Parcel data, reply; data.writeInterfaceToken(SERVICE_DESCRIPTOR); //写数据进data //data->write...(); ... remote()->transact(Fun1,data,&reply); if(0==reply->readExceptionCode()){ //读取返回的数据,如果需要的话 //result = reply->read...(); } return ...; }}
具体需要写进的数据和读取的数据依据具体的接口定义,可以参考IXXXService.java具体的函数实现,再通过android_os_Parcel.cpp找到对应的c++实现。
假如我们需要调用自己的aidl函数,只需要将我们的服务通过ServiceManager的addService方法将服务加到systemService便可通过上述方法调用了。
更多相关文章
- IPCThreadState 详解
- 网络请求工具类WebServiceUtils
- android 网络状态
- android service 学习 一
- delphi xe5 android 开发数据访问手机端(二)
- 聊聊Android应用实现跨进程调用
- Android(安卓)连接Mysql数据库步骤(新手步骤)
- android 导出带数据库文件的APK
- 退出 android 应用程序