第一,实现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->方法名
就这样吧。。。。