Tech & IT/프로그래밍

Binder5 (Android Framework)

해피콧 2012. 3. 21. 14:57
'); }
'); }
#include <sys/types.h>
#include <unistd.h>
#include <grp.h>
#include <binder/IPCThreadState.h>
#include <binder/ProcessState.h>
#include <binder/IServiceManager.h>
#include <utils/Log.h>
using namespace android;


#include "ICalc.h"

// 클라이언트는 BpCalc를 알 필요가 없다.
// 알면 안된다. 
// 이거는 이제 이거 다 되고 나면 Stub에서 설명하며 개선해 나갈듯


int main(int argc, char** argv)
{
    sp<ProcessState> proc(ProcessState::self());
    sp<IServiceManager> sm = defaultServiceManager();
    sp<IBinder> svc = sm->getService(String16("myserver1"));

    //아래 캐스팅을 하는 순간 ICalc::asInterface()를 호출하는 데 결국 거기서 BpCalc객체가 생성된다.
    //즉 , new BpCalc(svc)가 된다. 
    sp<ICalc> pCalc = interface_cast<ICalc>(svc);
    int ret = pCalc->Add(1,2);

    printf("result : %d\n", ret);

    return 0;
}


//BpCalc.h
#ifndef _BPCALC_H_
#define _BPCALC_H_

#include "ICalc.h"

class BpCalc : public BpInterface<ICalc>
{
public:
    BpCalc( const sp<IBinder>& binder);
    virtual int Add(int a, int b);
    virtual int Sub(int a, int b);

};


#endif //_BPCALC_H_
#include <sys/types.h>
#include <unistd.h>
#include <grp.h>
#include <binder/IPCThreadState.h>
#include <binder/ProcessState.h>
#include <binder/IServiceManager.h>
#include <utils/Log.h>

using namespace android;

#include "BpCalc.h"
BpCalc::BpCalc(const sp<IBinder>& binder) : BpInterface<ICalc>(binder)
{
}

int BpCalc::Add(int a, int b)
{
    Parcel data, reply;
    data.writeInt32(a);
    data.writeInt32(b);
    int ret = remote()->transact(ADD, data, &reply);
    return reply.readInt32();
}

int BpCalc::Sub(int a, int b)
{
    Parcel data, reply;
    data.writeInt32(a);
    data.writeInt32(b);
    int ret = remote()->transact(SUB, data, &reply);
    return reply.readInt32();
}

//
IMPLEMENT_META_INTERFACE(Calc, "myserver1") //asInterface imple




//ICalc.h

#ifndef _ICALC_H_
#define _ICALC_H_
enum {
    ADD = IBinder::FIRST_CALL_TRANSACTION,
    SUB,
};

class ICalc : public IInterface
{
public:
    virtual int Add(int a, int b) = 0;
    virtual int Sub(int a, int b) = 0;

    DECLARE_META_INTERFACE(Calc)
};
#endif //_ICALC_H_