'); }
'); }
#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_
'Tech & IT > 프로그래밍' 카테고리의 다른 글
돌아가는 실행파일이 사용하는 module알기(linux) (0) | 2012.03.22 |
---|---|
Calling Convention정확히 알아야 함(어셈으로 살펴보는 함수 call의 원리) (0) | 2012.03.22 |
Binder 2 (Android Framework) (0) | 2012.03.21 |
const 상수 함수 (함수가 멤버변수를 바꾸는게 없으면 무조건 꼭 const를 붙이자) (0) | 2012.03.21 |
Android Franwork Binder(Server, Client) c부터 cpp까지 (0) | 2012.03.20 |