Android 源码环境下 C++通过aidl与java层系统服务通信

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

你可能感兴趣的:(Android)