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<IXXXService>{
... 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便可通过上述方法调用了。