C++ binder 实现

Binder机制的实现集合了 Android系统四大组件Client,Server,Service Manager和Binder的驱动程序。

在应用层面,Client和Server直接通过Binder进行数据交互,Client对Server中的服务发出请求, Server打开Binder写入数据,Client通过Binder读取数据。Client和Server进程这间的数据通信通过Binder驱动程序间接实现,Client和Server通过open广法和ioctl文件操作方法与Binder驱动程序进行通信。

Binder驱动程序为应用层的进程间通信提供底层支持,它是一个misc类型设备,提供设备文件/dev/binder与用户空间交互,其中驱动的代码位置如下:

kernel/drivers/staging/android/binder.h

kernel/drivers/staging/android/binder.c

应用层进程之间通信的服务由Service Manager负责,它是一个守护进程,对Android系统中所有的Service进行管理,每个Server所提供的服务需要向Service Manager注册,以供Client进行查询和获取。


1 定义一个继承于BBinder类的TopsciService类,在TopsciService类中定义了初始化insantiate函数,构造函数,析构函数以及Client与Server交互的onTransact函数

class TopsciService : public BBinder

{

mutable Mutex mLock;

int32_t mNextConnId;

public:

//初始化,实例化Topsciservice

static int instantiate();


//TopsciService构造函数

TopsciService();


//TopsciService析构函数

virtual ~TopsciService();


//打开Binder设备

virtual status_t onTransact( uint32_t, const Parcel&, Parcel*, uint32_t);

}


2 TopsciService类的具体实现

TopsciService成员函数instantiate实现了对TopsciService类初始化功能,即调用addService函数把TopsciService作为一项服务添加到ServiceManager中,完成向ServiceManager的注册工作。


static int TopsciService::instantiate()

{

int r = defaultServiceManager()->addService(String16("guilh.add"),new TopsciService());

return r;

}

TopsciService的onTransact函数实现了Client与TopsciService Server之间的具体通信,当Client准备向TopsciService发送消息时,首先创建一个Handler为0的代理对象Binder,然后Client发送请求给这个代理对象,该代理对象通过驱动把信息传递给Server,TopsciService服务读取到Client发给它的数据后,将此数据加1000送返回给Client.

TopsciService::onTransact(uint32_t code, const Parcel& data,Parcel* reply,unit32_t flags)

{

switch(code)

{

case 0:

{

pid_t pid = data.readInt32();

int num = data.readInt32(); //读取Client发送的数据

num = num+1000;

reply->writeInt32(num);//把加1000后的数据发送回客户端

return NO_ERROR;

}

break;

default:

//如果client创建的handler不为0,则调用BBinder类onTransact

return BBInder::onTransact(code,data,reply,flags);

}

}


TopsciService应用程序主入口

int main(int argc,char** argv)

{

//获得一个ProcessState实例

sp<ProcessState> proc(ProcessState::self());

//获取ServiceManager

sp<IServiceManager> sm = defaultServiceManager();


//把自己作为服务添加到ServiceManager

TopsciService::instantiate();

//启动缓冲 池

ProcessState::self()->startThreadPool();

//把服务添加到Binder闭合循环进程中

IPCThreadState::self()->joinThreadPool();

return 0;

}


Client端

class TopsciClient :public BBinder

{

int main()

{

sp<IServiceManager> sm = defaultServiceManager();

sp<IBinder> b = sm->getService(String16("guilh.add")); 

if (b == NULL)

{

return -1;

}


Parcel in1 ,out1;

TopsciClient* cb = new TopsciClient();

in1.wirteInt32((int)getpid());

in1.writeInt32(0);

int ret = b->transact(0,in1,&out1,0);


ProcessState::self()->startThreadPool();

IPCThreadState::self()->joinThreadPool();

return 0;

}

}

你可能感兴趣的:(C++ binder 实现)