binder通信問題求大神幫忙解答

寫了個測試的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

多謝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章