用C++开发Binder服务

  用C++来实现Binder服务比较麻烦,原因是没有AIDL的辅助,必须手工来写中间的代码。

  首先写一个服务类ExampleServer的代码:

 class  ExampleServer : public BnExampleServer
{
public :
ExampleServer (): mValue();
int get ()
{
return mValue;
} void set (int x)
{
mValue = x;
}
private:
int mValue;
};

  服务类的代码简单,基本上和写一个普通的C++类一样,唯一的区别就是必须继承自定义类BnExampleServer,BnExampleServer类定义如下:

 class IExampleServer : public IInterdace
{
public:
DECLARE_META_INTERFACE(ExampleServer) ;
virtual int get() = ;
virtual void set(int value) = ;
}; class BnExampleServer : public BnInterface<IExampleServer>
{
public:
virtual status_t onTransact (uint32_t code, const Parcel& data, Parcel * reply, uint32_t flags = );
}

 BnExampleServer重载了底层的方法onTansact(),继承了模板类BnInterface<IExampleServer>, IExampleServer是一个接口类,必须是派生IInterface类,主要的功能就是使用纯虚函数定义服务的接口函数。

  还要是实现BpExampleServer类:

 enum {
EXAMPLE_GET = IBinder::FIRST_CALL_TRANSACTION,
EXAMPLE_SET,
};
class BpExampleServer : public BpInterface <IExampleServer>
{
public:
BpExampleServer(const sp<IBinder> &impl):BpInterface<IExampleServer>(impl){}
virtual int get ()
{
Parcel data, reply;
data.writeInterfaceToken(IExampleServer::getInterfaceDescriptor());
remote()->transact(EXAMPLE_GET, data, &reply);
return reply.readInt();
}
virtual void set (int value)
{
Parcel data, reply;
data.writeInterfaceToken(IExampleServer::getInterfaceDescriptor());
data.writeInt(value);
remote()->transact(EXAMPLE_SET, data, &reply);
return ;
}
IMPLEMENT_META_INTERFACE(ExampleServer, "ExampleDescriptor"); status_t BnExampleServer::onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
switch (code)
{
case EXAMPLE_GET:
CHECK_INTERFACE(IExampleServer, data, reply);
reply->writeInt(get());
break;
case EXAMPLE_SET:
CHECK_INTERFACE(IExampleServer, data, reply);
set(data->readInt());
break;
default:
return BBinder::onTransact(code, data, reply, flags);
}
return NO_ERROR;
}

 服务运行起来:

 ExampleServer * server = new ExampleServer();
defaultServerManager()->addService(String16("example_server"), service);

aaarticlea/png;base64,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" alt="" />

上一篇:SDWebImage源码解读_之SDWebImageDecoder


下一篇:【solr】Solr与JDK对应版本关系,Tomcat与JDK