用C++开发Binder服务
用C++来实现Binder服务比较麻烦,原因是没有AIDL的辅助,必须手工来写中间的代码。
首先写一个服务类ExampleServer的代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 };
服务类的代码简单,基本上和写一个普通的C++类一样,唯一的区别就是必须继承自定义类BnExampleServer,BnExampleServer类定义如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
BnExampleServer重载了底层的方法onTansact(),继承了模板类BnInterface<IExampleServer>, IExampleServer是一个接口类,必须是派生IInterface类,主要的功能就是使用纯虚函数定义服务的接口函数。
还要是实现BpExampleServer类:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
服务运行起来:
1 ExampleServer * server = new ExampleServer(); 2 defaultServerManager()->addService(String16("example_server"), service);