您的位置:首页 > 其它

binder 通信实例

2012-11-15 18:29 176 查看
第一,实现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->方法名

就这样吧。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: