Android Binder机制的Native应用

来源:互联网 发布:周琦比赛数据 编辑:程序博客网 时间:2024/05/29 17:32

mkdir testbinder  //创建testbinder目录

Android.mk

include $(call all-subdir-makefiles)

一、接口类

mkdir interface  //创建interface目录,存放接口类

Itestbinder.h

#include <binder/IInterface.h>namespace android{  class Itestbinder : public IInterface{    public:      DECLARE_META_INTERFACE(testbinder);      virtual int testinterface(int a) = 0;  };  /////////////////////  class Bntestbinder : public BnInterface<Itestbinder>{  public:    virtual status_t    onTransact( uint32_t code,                                    const Parcel& data,                                    Parcel* reply,                                    uint32_t flags = 0);  };}
Itestbinder.cpp
#include "Itestbinder.h"#include <binder/Parcel.h>#include <binder/IInterface.h>namespace android{  enum {    TEST_INTERFACE,  };//////////////////客户端  class Bptestbinder : public BpInterface<Itestbinder>{    public:      Bptestbinder(const sp<IBinder>& impl) : BpInterface<Itestbinder>(impl){      }      virtual int testinterface(int a){        LOGD("TK---->>>>>>Itestbinder.cpp>>>>Bptestbinder::testinterface\n");        Parcel data,reply;        data.writeInt32(a);        remote()->transact(TEST_INTERFACE,data,&reply);        return reply.readInt32();      }  };  IMPLEMENT_META_INTERFACE(testbinder, "android.test.Itestbinder");/////////////////服务端  status_t Bntestbinder::onTransact(      uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags){    LOGD("TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact\n");    switch (code) {      case TEST_INTERFACE:{        //CHECK_INTERFACE(Itestbinder, data, reply);        LOGD("TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact>>111\n");        reply->writeInt32(testinterface((int) data.readInt32()) );        return NO_ERROR;      } break;      default:{        LOGD("TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact>>222\n");        return BBinder::onTransact(code, data, reply, flags);      }    }  }}

二、客户端实现

mkdir client  //创建client目录,这个是client的实现

client.h

#include "../interface/Itestbinder.h"namespace android{  class client{    public:      static const sp<Itestbinder>& get_test_binder();      static sp<Itestbinder> gtestbinder;  };}
client.cpp
#include "client.h"#include <binder/IServiceManager.h>#include <utils/Log.h>#include <stdio.h>namespace android{  sp<Itestbinder> client::gtestbinder;  const sp<Itestbinder>& client::get_test_binder(){    if (gtestbinder == 0) {        sp<IServiceManager> sm = defaultServiceManager();        sp<IBinder> binder;        do {            binder = sm->getService(String16("test.Itestbinder"));            if (binder != 0)                break;            printf("testbinder not published, waiting...");            usleep(500000); // 0.5 s        } while (true);        gtestbinder = interface_cast<Itestbinder>(binder);    }    if(gtestbinder==0) printf("no testbinder!?");    return gtestbinder;  }}
main.cpp
#include <stdio.h>#include "client.h"using namespace android;int main(int argc, char* argv[]){  client* myclient = new client();  if(myclient == NULL) return 0;  const sp<Itestbinder>& tb = myclient->get_test_binder();  if(tb == NULL) return 0;  int a = tb->testinterface(3);  LOGD("TK-------->>>result is %d\n",a);  delete myclient;  return 0;}

Android.mk

LOCAL_PATH:= $(call my-dir)#LOCAL_CFLAGS_ALL :=-I. -I$(LOCAL_PATH)/..include $(CLEAR_VARS)LOCAL_SRC_FILES:= \client.cpp \main.cpp \../interface/Itestbinder.cppLOCAL_SHARED_LIBRARIES := \        libui libcutils libutils libbinder libsonivox libicuuc libexpat \libdlLOCAL_MODULE:= clientLOCAL_MODULE_TAGS := optionalinclude $(BUILD_EXECUTABLE)

三、服务端

mkdir server  //创建server目录,这个是服务端实现

testbinder.h

#include "../interface/Itestbinder.h"#include <binder/BinderService.h>namespace android{  class testbinder:       public BinderService<testbinder>,      public Bntestbinder{    friend class BinderService<testbinder>;    public:      static const char* getServiceName() { return "test.Itestbinder"; }      virtual int testinterface(int a);      virtual     status_t    onTransact(                                uint32_t code,                                const Parcel& data,                                Parcel* reply,                                uint32_t flags);  };}
testbinder.cpp
#include <binder/IPCThreadState.h>#include <binder/IServiceManager.h>#include <utils/Log.h>//#include <utils/Trace.h>#include <binder/Parcel.h>#include <binder/IPCThreadState.h>#include <utils/String16.h>#include <utils/threads.h>#include <utils/Atomic.h>//#include <cutils/bitops.h>#include <cutils/properties.h>#include <cutils/compiler.h>#include "testbinder.h"namespace android{  int testbinder::testinterface(int a){    LOGD("TK---->>>>>>testbinder.cpp>>>>testbinder::testinterface\n");    return a+2;  }  status_t testbinder::onTransact(        uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags){    LOGD("TK---->>>>>>testbinder.cpp>>>>testbinder::onTransact\n");    return Bntestbinder::onTransact(code, data, reply, flags);  }}
main.cpp
#include <binder/IPCThreadState.h>#include <binder/ProcessState.h>#include <binder/IServiceManager.h>#include <utils/Log.h>#include "testbinder.h"using namespace android;int main(int argc, char** argv){  sp<ProcessState> proc(ProcessState::self());  sp<IServiceManager> sm = defaultServiceManager();  LOGI("ServiceManager: %p", sm.get());  testbinder::instantiate();  ProcessState::self()->startThreadPool();  IPCThreadState::self()->joinThreadPool();  return 0;}

Android.mk

LOCAL_PATH:= $(call my-dir)#LOCAL_CFLAGS_ALL :=-I. -I$(LOCAL_PATH)/..include $(CLEAR_VARS)LOCAL_SRC_FILES:= \main.cpp \testbinder.cpp \../interface/Itestbinder.cppLOCAL_SHARED_LIBRARIES := \        libui libcutils libutils libbinder libsonivox libicuuc libexpat \libdlLOCAL_MODULE:= serverLOCAL_MODULE_TAGS := optionalinclude $(BUILD_EXECUTABLE)

四、运行

./server

./client

结果:

result:1.clientroot@android:/data # ./client                                                  TK---->>>>>>Itestbinder.cpp>>>>Bptestbinder::testinterfaceTK-------->>>result is 42.serverroot@android:/data # ./server                                                  TK---->>>>>>testbinder.cpp>>>>testbinder::onTransactTK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransactTK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact>>111TK---->>>>>>testbinder.cpp>>>>testbinder::testinterface=============================================================I/        (  624): ServiceManager: 0xc708D/        (  626): TK---->>>>>>Itestbinder.cpp>>>>Bptestbinder::testinterfaceD/        (  624): TK---->>>>>>testbinder.cpp>>>>testbinder::onTransactD/        (  624): TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransactD/        (  624): TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact>>111D/        (  624): TK---->>>>>>testbinder.cpp>>>>testbinder::testinterfaceD/        (  626): TK-------->>>result is 5


0 0
原创粉丝点击