写了个测试的binder通信的代码,可是运行的时候显示transact函数返回数据错误Not a data message。代码如下
IServiceTest.h
```#ifndef __ISERVICETEST_H__
#define __ISERVICETEST_H__
#include <binder/IInterface.h>
#include <binder/Parcel.h>
using android::status_t;
namespace android {
class IServiceTest:public IInterface{
public:
DECLARE_META_INTERFACE(ServiceTest);
virtual int setTest()= 0;
virtual int getTest()= 0;
};
class BnServiceTest:public BnInterface<IServiceTest>{
public:
virtual status_t OnTransact(int code,
const Parcel &data,
Parcel *replay,
int flag=0);
};
};
#endif
```
IServiceTest.cpp
#include <IServiceTest.h>
#include <log.h>
#include <utils/StrongPointer.h>
#include <errno.h>
namespace android{
enum{
CODE_SET_TEST = IBinder::FIRST_CALL_TRANSACTION,
CODE_GET_TEST,
};
class BpServiceTest:public BpInterface<IServiceTest>{
public:
BpServiceTest(const sp<IBinder> &impl)
:BpInterface<IServiceTest>(impl)
{
}
virtual int setTest()
{
Parcel data,reply;
data.writeInterfaceToken(IServiceTest::getInterfaceDescriptor());
status_t status = remote()->transact(CODE_SET_TEST,data,&reply);
if(status != NO_ERROR){
BINDER_LOG_ERROR("transact error,%d,%s\n",status,strerror(-status));
}
return (int)status;
}
virtual int getTest()
{
Parcel data,reply;
data.writeInterfaceToken(IServiceTest::getInterfaceDescriptor());
status_t status = remote()->transact(CODE_GET_TEST,data,&reply);
if(status != NO_ERROR){
BINDER_LOG_ERROR("getTest transact error,%d\n",status);
}
return (int)status;
}
};
IMPLEMENT_META_INTERFACE(ServiceTest,"android.test.IServiceTest");
status_t BnServiceTest::OnTransact(int code,const Parcel & data,Parcel * replay,int flag)
{
BINDER_LOG_DEBUG("code =%d\n",code);
switch(code){
case CODE_SET_TEST:
CHECK_INTERFACE(IServiceTest,data,replay)
setTest();
break;
case CODE_GET_TEST:
CHECK_INTERFACE(IServiceTest,data,replay)
getTest();
break;
}
return NO_ERROR;
}
};
```
```
Client端
main函数
#include <IServiceTest.h>
#include <binder/IServiceManager.h>
#include <utils/StrongPointer.h>
#include <log.h>
using namespace android;
int main(int argc,char **argv)
{
sp<IBinder> test = defaultServiceManager()->getService(String16("service.test"));
if(test == NULL){
BINDER_LOG_ERROR("can not get service\n");
return -1;
}
sp<IServiceTest> ptest = IServiceTest::asInterface(test);
if(ptest == NULL){
BINDER_LOG_ERROR("can not get proxy class ptest");
return -1;
}
ptest->setTest();
ptest->getTest();
}
```
```
Server端
ServiceTest.h
#ifndef __SERVICETEST_H__
#define __SERVICETEST_H__
#include <IServiceTest.h>
namespace android{
using android::status_t;
class ServiceTest:public BnServiceTest{
public:
static void instance();
virtual int setTest();
virtual int getTest();
virtual status_t OnTransact(int code,const Parcel & data,Parcel* replay,int flag = 0);
};
};
#endif
```
```
ServiceTest.cpp
#include <ServiceTest.h>
#include <binder/IServiceManager.h>
#include <log.h>
#define INTERFACE_DESCRiPTOR "service.test"
namespace android{
void ServiceTest::instance()
{
defaultServiceManager()->addService((String16)INTERFACE_DESCRiPTOR,new ServiceTest());
}
int ServiceTest::setTest()
{
BINDER_LOG_DEBUG("%s\n",__FUNCTION__);
return 0;
}
int ServiceTest::getTest()
{
BINDER_LOG_DEBUG("%s\n",__FUNCTION__);
return 0;
}
status_t ServiceTest::OnTransact(int code,const Parcel & data,Parcel * replay,int flag)
{
return BnServiceTest::OnTransact(code,data,replay,flag);
}
};
main函数
#include <ServiceTest.h>
#include <utils/StrongPointer.h>
#include <binder/ProcessState.h>
#include <binder/IPCThreadState.h>
using namespace android;
int main(int argc,char **argv)
{
ServiceTest::instance();
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
return 0;
}
```
```
麻烦哪位大神帮小弟看看这里有什么问题
错误是05-22 13:53:59.741 1685 1685 E binder_test: transact error,-74,Not a data message
05-22 13:53:59.741 1685 1685 E binder_test: getTest transact error,-74
多谢