使用binder

来源:互联网 发布:静态数据采集仪 编辑:程序博客网 时间:2024/06/05 07:01

前面我们已经写好了bindercase的各种实现了,把它编译成.so就ok啦。

下面把这个case 服务给跑起来

A进程

main_test.cpp

#include <sys/types.h>
#include <unistd.h>
#include <cutils/log.h>
#include <binder/IServiceManager.h>
#include <binder/ProcessState.h>
#include <binder/IPCThreadState.h>
#include "../libTest/ITest.h"


using namespace android;
int main(int argc, char** argv)
{
    sp<ProcessState> proc(ProcessState::self());
    sp<IServiceManager> sm = defaultServiceManager();
    LOGI("ServiceManager: %p", sm.get());
    TestService::instantiate();  //这里加入serviceManager中
    ProcessState::self()->startThreadPool();
    IPCThreadState::self()->joinThreadPool();


    return 0;
}

就这么简单,    TestService::instantiate();  这个instantiate()方法在前面有实现可以看看,其他的代码都是模型,具体含义可以去查查。

接下来就是使用了

B进程

client_test.cpp

#include <sys/types.h>
#include <unistd.h>
#include <cutils/log.h>
#include <binder/IServiceManager.h>
#include <binder/ProcessState.h>
#include <binder/IPCThreadState.h>
#include "../libTest/ITest.h"
using namespace android;


int main()
{
    sp<IBinder> binder;
    static sp<ITest> sTestManager = NULL;
    
 //   if(sTestManager != NULL)
 //   return 0;
    
    sp<IServiceManager> sm = defaultServiceManager();
    do {
        binder = sm->getService(String16("test.service"));
        if (binder == 0) {
            printf("TestService not published, waiting...");
            usleep(500000); // 0.5 s
        }
    } while(binder == 0);
       printf("TestService get succ...");
    if(sTestManager == NULL){
    sTestManager = interface_cast<ITest>(binder);
     }
     sTestManager->getTest();
     sTestManager->setTest();
     
     return 0;
}

这个也很简单,获取bp对象,使用pb对象的方法,bp会和bn交互。

ok case就写到这里了。