binder小例子

来源:互联网 发布:创新的社会网络 编辑:程序博客网 时间:2024/06/07 02:27

ITest.h

#ifndef ANDROID_ITEST_H

#define ANDROID_ITEST_H
#include <utils/Errors.h>  // for status_t
#include <utils/KeyedVector.h>
#include <utils/RefBase.h>
#include <utils/String8.h>
#include <binder/IInterface.h>
#include <binder/Parcel.h> 
namespace android {
class ITest: public IInterface
{
protected:
enum
{
TEST_GETTEST = 0,
TEST_SETTEST,
};
public:
DECLARE_META_INTERFACE(Test); //声明重要宏定义
//定义纯虚函数
virtual void getTest() = 0;
virtual void setTest() = 0;
};


//BnTest 声明
class BnTest: public BnInterface<ITest>
{
public:
    virtual status_t    onTransact( uint32_t code,
                                    const Parcel& data,
                                    Parcel* reply,
                                    uint32_t flags = 0);
};


class TestService: public BnTest
{
public:
static void instantiate();
//static char const* getServiceName() { return "test.service"; }
//服务端实现接口函数
virtual void getTest();
virtual void setTest();
};
// ----------------------------------------------------------------------------




}; // namespace android


#endif // ANDROID_ITEST_H

//binder的思路是,首先我们需要一个IXXX类,然后bp和bn分别继承自这个类,这两个类都必须要实现IXXX类中的方法(自己定义的一些方法),bp实现是用于使用者调用,而bn实现是用于——没用(只是基类里面是虚函数,必须要实现),

ITest.cpp

#include <sys/types.h>
#include <unistd.h>
#include <cutils/log.h>
#include <binder/IServiceManager.h>
#include <binder/IPCThreadState.h>
#include "ITest.h"         
namespace android {
   //BpTest实现
class BpTest : public BpInterface<ITest>
{
public:
    BpTest(const sp<IBinder>& impl): BpInterface<ITest>(impl)
    {
    }
    
    virtual void getTest()
    {
    Parcel data,reply;
    data.writeInterfaceToken(ITest::getInterfaceDescriptor());
    //TODO... 使用类似的writeXXX函数
    remote()->transact(TEST_GETTEST,data,&reply);
    int ret = reply.readInt32();
    return ;
    }
    
    virtual void setTest()
    {
    Parcel data,reply;
    data.writeInterfaceToken(ITest::getInterfaceDescriptor());
    //TODO... 使用类死的writeXXX函数
    remote()->transact(TEST_SETTEST,data,&reply);
    int ret = reply.readInt32();
    return ;
    }
};




//BnTest实现
//重要的一个定义实现
IMPLEMENT_META_INTERFACE(Test, "android.Test.ITest"); 




status_t BnTest::onTransact(
    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
    switch(code){
    case TEST_GETTEST:{
        CHECK_INTERFACE(ITest, data, reply);
        getTest();
    }break;
    case TEST_SETTEST:{
        CHECK_INTERFACE(ITest, data, reply);
        setTest();
    }break;
    default:
    break;
    }
    return 0;
}




// ----------------------------------------------------------------------


void TestService::getTest()
{
printf("getTest----------------!\n");
}
void TestService::setTest()
{
printf("setTest----------------!\n");
}
void TestService::instantiate() {
    defaultServiceManager()->addService(
            String16("test.service"), new TestService());
}
}

bn端必须要实现onTransact这个方法,因为正是这个方法在和bp端通讯,bp端remote()->transact()这个方法在bn端由onTransac这个方法在处理(里面具体怎么弄,你可以返回说“你很帅‘……我的代码里面是调用了实现IXXX类的方法)这样bp和bn就可以通讯了,下面要做的就是注册servers和获取bp端了。


原创粉丝点击