binder 通信实例

来源:互联网 发布:lurker软件 编辑:程序博客网 时间:2024/05/17 07:08

第一,实现libaddservice.so 的库

1. addservice.h

#ifndef ANDROID_GUILH_ADD_SERVICE_H
#define ANDROID_GUILH_ADD_SERVICE_H


#include <utils/RefBase.h>
#include <binder/IInterface.h>
#include <binder/Parcel.h>
#include <utils/threads.h>


namespace android{
 class AddService:public BBinder { //从BBinder派生,实现本地接口
  public:
   int mNextConnId;
   static int instantiate();
   AddService();
   virtual ~AddService();
   virtual status_t onTransact(uint32_t, const Parcel&, Parcel*, uint32_t);
 };
}; //namespace

#endif

 

 

 

2.addservcie.cpp

#include "AddService.h"
#include <binder/IServiceManager.h>
#include <binder/IPCThreadState.h>
namespace android {
 static struct sigaction oldact;
 static pthread_key_t sigbuskey;
 //把自己注册到系统中
 int AddService::instantiate() {
  LOGE("AddService Instantiate");
  int r = defaultServiceManager()->addService(
    String16("guilh.add"),
    new AddService());   //把AddService这个服务添加到binder中名为guilh.add
  LOGE("AddService r= %d\n", r);
  return r;
 }
 //构造函数
 AddService::AddService() {
  LOGV("AddService Created");
  mNextConnId = 1;
  pthread_key_create(&sigbuskey, NULL);
 }

 //析构函数
 AddService::~AddService() {
  pthread_key_delete(sigbuskey);
  LOGV("AddService destroyed");
 }

 status_t AddService::onTransact(
   uint32_t code,
   const Parcel& data,
   Parcel* reply,
   uint32_t flags) {
  switch(code){
   case 0: {//根据code的不同执行不同的操作
    pid_t pid = data.readInt32();
    int num   = data.readInt32();
    num += 1000;
    reply->writeInt32(num);
    return NO_ERROR;}
    break;
   default:
    return BBinder::onTransact(code, data, reply, flags);
  }
 }
} //namespace

 

 

3.Android.mk

LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
 AddService.cpp
LOCAL_C_INCLUDES:= \
 $(JNI_H_INCLUDES)
LOCAL_SHARED_LIBRARIES:= \
 libcutils \
 libutils \
 libbinder \
 libandroid_runtime
LOCAL_MODULE_TAGS := eng
LOCAL_PRELINK_MODULE:=false
LOCAL_MODULE:=libAddService
include $(BUILD_SHARED_LIBRARY)

1.2.3步实现一个libservice.so

 

第二实现 addservice可执行文件

1.addservice.cpp

#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>
#include <private/android_filesystem_config.h>
#include "../libaddservice/AddService.h"

using namespace android;
int main(int argc, char** argv) {
 sp<ProcessState> proc(ProcessState::self());
 sp<IServiceManager> sm = defaultServiceManager();
 AddService::instantiate();
 ProcessState::self()->startThreadPool();
 IPCThreadState::self()->joinThreadPool();
}

2.android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := AddServer.cpp
LOCAL_SHARED_LIBRARIES := libutils libbinder libAddService
LOCAL_MODULE := addservice
LOCAL_MODULE_TAGS := eng
include $(BUILD_EXECUTABLE)

1.2实现了 可执行文件addservice。将可执行文件放在system/bin/下

 

 

第三步启动service

android-rfs中修改init.rc 

添加:

service addservice  /system/bin/addservice
    class core
    user root
    group system
    critical
    oneshot

这样就可以了,再次通过nfs启动android,或者将android-rfs制作成image,烧入板子。

通过nfs查看进程

ps

 --------------------------------------------------system/bin/addservice  这个进程就会出现。

 

第四步

写一个客户端去验证一下。

    client自己去随便封装一个。可以看看mediaplayclient.cpp

调用addservice的主要语句

主要的3句:

     android::sp<android::IServiceManager> sm = android::defaultServiceManager();
     android::sp<android::IBinder> binder;
     android::sp<IAddServiceClient> client;     
     binder = sm->getService(android::String16(“guilh.add”));
     client = android::interface_cast<IAddServiceClientt>(binder);

     client->方法名

 

就这样吧。。。。