binder示例demo
时间: 2023-07-07 15:20:57 浏览: 123
这是一个简单的binder示例demo,包含一个服务端和一个客户端:
服务端代码(ServiceDemo.cpp):
#include <binder/IServiceManager.h>
#include <binder/IPCThreadState.h>
#include <binder/ProcessState.h>
#include <binder/IMemory.h>
#include "ServiceDemo.h"
using namespace android;
int main(int argc, char **argv)
{
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
sm->addService(String16("demo.service"), new ServiceDemo());
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
return 0;
}
ServiceDemo::ServiceDemo()
{
ALOGD("ServiceDemo");
}
ServiceDemo::~ServiceDemo()
{
ALOGD("~ServiceDemo");
}
int32_t ServiceDemo::add(int32_t a, int32_t b)
{
ALOGD("add: %d + %d = %d", a, b, a + b);
return a + b;
}
客户端代码(ClientDemo.cpp):
#include <binder/IServiceManager.h>
#include <binder/IPCThreadState.h>
#include <binder/ProcessState.h>
#include <binder/IMemory.h>
#include "ServiceDemo.h"
using namespace android;
int main(int argc, char **argv)
{
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
sp<IBinder> binder = sm->getService(String16("demo.service"));
sp<ServiceDemo> serviceDemo = interface_cast<ServiceDemo>(binder);
ALOGD("add result: %d", serviceDemo->add(1, 2));
return 0;
}
需要注意的是,在服务端代码中,需要实现aidl文件中定义的接口方法。在本例中,接口方法只有一个add(),返回两个int类型数据的和。
在客户端代码中,首先通过defaultServiceManager()获取IServiceManager对象,然后通过getService()获取服务端的IBinder对象,最后将IBinder对象转换为服务端接口ServiceDemo对象,并调用其中的方法。
本例中,将服务名设为"demo.service",可以根据实际需求修改。