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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值