android binder机制实现
2010-05-31 14:30:00 来源:WEB开发网reply->writeInt32(0);
reply->writeInt32(res ? 1 : 0);
return NO_ERROR;
} break;
default:
return BBinder:: BnTransact(code, data, reply, flags);
}
}
status_t BnPermissionController:: BnTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { switch(code) { case CHECK_PERMISSION_TRANSACTION: { CHECK_INTERFACE(IPermissionController, data, reply); String16 permission = data.readString16(); int32_t pid = data.readInt32(); int32_t uid = data.readInt32(); bool res = checkPermission(permission, pid, uid); reply->writeInt32(0); reply->writeInt32(res ? 1 : 0); return NO_ERROR; } break; default: return BBinder:: BnTransact(code, data, reply, flags); } }
在onTransact()函数中根据枚举值判断数据使用的方式。注意,由于BnPermissionController也是继承了类
IPermissionController,但是纯虚函数checkPermission()依然没有实现。因此这个
BnPermissionController类并不能实例化,它其实也还是一个接口,需要一个实现类来继承它,那才是实现具体功能的类。
3.2 BnABC的实现
本地服务启动后将形成一个守护进程,具体的本地服务是由一个实现类继承BnABC来实现的,这个服务的名称通常叫做ABC。
在其中,通常包含了一个instantiate()函数,这个函数一般按照如下的方式实现:
void ABC::instantiate() {
defaultServiceManager()->addService(
String16("XXX.ABC"), new ABC ());
}
按照这种方式,通过调用defaultServiceManager()函数,将增加一个名为"XXX.ABC"的服务。
在这个defaultServiceManager()函数中调用了:
ProcessState::self()->getContextObject(NULL));
IPCThreadState* ipc = IPCThreadState::self();
IPCThreadState::talkWithDriver()
在ProcessState 类建立的过程中调用open_driver()打开
驱动
程序,在talkWithDriver()的执行过程中。
3.3 BpABC调用的实现
BpABC调用的过程主要通过mRemote()->transact()
赞助商链接