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->方法名
就这样吧。。。。
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->方法名
就这样吧。。。。
相关文章推荐
- Binder客户端和驱动端通信流程实例分析----以acquireWakeLock()函数为例 (一)
- Binder客户端和驱动端通信流程实例分析----以acquireWakeLock()函数为例 (二)
- 实例分析android中的Binder通信机制(3)
- Android Service Binder交互通信实例
- 【代码】android软件开发 Service Binder交互通信实例
- 实例分析android中的Binder通信机制(2)
- Android Service Binder交互通信实例
- [转]android jni层binder使用/进程通信实例
- binder通信实例之java客户端与c++服务端
- 实例分析android中的Binder通信机制(1)
- binder通信实例之c++客户端与c++服务端
- Android binder通信实例
- iOS网络编程实践--蓝牙对等网络通信实例讲解
- vue2.0组件通信各种情况总结与实例分析
- linux 本地通信实例 AF_UNIX
- C语言实现服务端和客户端进行TCP通信实例
- android binder机制之——(我是binder实例)
- 架构设计:系统间通信(13)——RPC实例Apache Thrift 下篇(1)
- Linux中与内核通信的Netlink机制(实例)
- Android之网络编程之网络通信几种方式实例分享