用C++开发Binder服务

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

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

 1 class  ExampleServer : public BnExampleServer
 2 {
 3     public :
 4         ExampleServer (): mValue(0);
 5         int get () 
 6         {
 7              return mValue;            
 8         }
 9     
10         void set (int x)
11         {
12              mValue = x;
13         }        
14     private:
15         int mValue;
16 };
View Code

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

 1 class IExampleServer : public IInterdace
 2 {
 3      public:
 4           DECLARE_META_INTERFACE(ExampleServer) ;
 5           virtual int get() = 0;
 6           virtual void set(int value) = 0;
 7 };
 8 
 9 class BnExampleServer : public BnInterface<IExampleServer>
10 {
11      public:
12          virtual status_t onTransact (uint32_t code, const Parcel& data, Parcel * reply, uint32_t flags = 0);
13 }
View Code

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

  还要是实现BpExampleServer类:

 1 enum {
 2    EXAMPLE_GET = IBinder::FIRST_CALL_TRANSACTION,
 3    EXAMPLE_SET,   
 4 };
 5 class BpExampleServer : public BpInterface <IExampleServer>
 6 {
 7      public:
 8           BpExampleServer(const sp<IBinder> &impl):BpInterface<IExampleServer>(impl){}
 9      virtual int get ()
10     {
11           Parcel data, reply;
12           data.writeInterfaceToken(IExampleServer::getInterfaceDescriptor());
13          remote()->transact(EXAMPLE_GET, data, &reply);
14          return reply.readInt();   
15      }
16  virtual void set (int value)
17     {
18           Parcel data, reply;
19           data.writeInterfaceToken(IExampleServer::getInterfaceDescriptor());
20          data.writeInt(value);
21          remote()->transact(EXAMPLE_SET, data, &reply);
22          return ;
23      }
24 IMPLEMENT_META_INTERFACE(ExampleServer, "ExampleDescriptor");
25 
26 status_t BnExampleServer::onTransact(uint32_t code, const Parcel& data,  Parcel* reply, uint32_t flags)
27 {
28       switch (code)
29      {
30            case EXAMPLE_GET:
31                CHECK_INTERFACE(IExampleServer, data, reply);
32                reply->writeInt(get());
33                break;
34            case EXAMPLE_SET:
35                CHECK_INTERFACE(IExampleServer, data, reply);
36                set(data->readInt());
37                break;
38           default:
39                return BBinder::onTransact(code, data, reply, flags);
40      }
41     return NO_ERROR;
42 }    
View Code

  服务运行起来:

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

posted @ 2016-11-14 11:45  winfu  阅读(359)  评论(0编辑  收藏  举报