问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何使用Binder实现分析

发布网友 发布时间:2022-04-22 07:20

我来回答

1个回答

热心网友 时间:2022-06-17 14:07

(1)获得ServiceManager的对象引用

(2)向ServiceManager注册新的Service

(3)在Client中通过ServiceManager获得Service对象引用

(3)在Client中发送请求,由Service返回结果。

下面看具体的代码如何实现。

3.1 libmyservice代码实现

(1)新建目录frameworks/base/myservice/libservice,进入该目录

view plain
$ cd frameworks/base
$ mkdir myservice
$ cd myservice
$ mkdir libmyservice
$ cd libmyservice

(2)编写libmyservice/myservic.h文件

view plain
#include <utils/threads.h>

#include <utils/RefBase.h>

#include <binder/IInterface.h>

#include <binder/BpBinder.h>

#include <binder/Parcel.h>

namespace android {

class MyService : public BBinder

{

mutable Mutex mLock;

int32_t mNextConnId;

public:

static int instantiate();

MyService();

virtual ~MyService();

virtual status_t onTransact(uint32_t, const Parcel&, Parcel*, uint32_t);

};

}; //namespace

(2)编写libservice/myservice.cpp文件

view plain
#include "myservice.h"

#include <binder/IServiceManager.h>

#include <binder/IPCThreadState.h>

namespace android {

static struct sigaction oldact;

static pthread_key_t sigbuskey;

int MyService::instantiate()

{

LOGE("MyService instantiate");

// defaultServiceManager ()获得ServiceManager的对象引用,addService()可向ServiceManager注册新的服务

int r = defaultServiceManager()->addService(String16("android.myservice"), new MyService());

LOGE("MyService r = %d/n", r);

return r;

}

MyService::MyService()

{

LOGV("MyService created");

mNextConnId = 1;

pthread_key_create(&sigbuskey, NULL);

}

MyService::~MyService()

{

pthread_key_delete(sigbuskey);

LOGV("MyService destroyed");

}

// 每个系统服务都继承自BBinder类,都应重写BBinder的onTransact虚函数。当用户发送请求到达Service时,系统框架会调用Service的onTransact函数,该函数分析接收到的数据包,调用相应的接口函数处理请求

status_t MyService::onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)

{

switch(code)

{

case 0: {

pid_t pid = data.readInt32();

int num = data.readInt32();

num = num + 100;

reply->writeInt32(num);

return NO_ERROR;

}

break;

default:

return BBinder::onTransact(code, data, reply, flags);

}

}

}; //namespace

(3)编写libservice/Android.mk文件

view plain
# File: Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := myservice.cpp
LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
LOCAL_SHARED_LIBRARIES := libutils libbinder
LOCAL_MODULE_TAGS := optional
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE := libmyservice

include $(BUILD_SHARED_LIBRARY)

(4)编译libmyservice.so动态库

在android源码主目录下

view plain
$ source build/envsetup.sh

including device/htc/passion/vendorsetup.sh

including device/samsung/crespo4g/vendorsetup.sh

including device/samsung/crespo/vendorsetup.sh

$ mmm frameworks/base/myservice/libmyservice/

编译成功后生成文件:out/target/proct/generic/system/lib/libmyservice.so
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
医生,游泳篮球相比之下哪一样比较容易长高 打篮球和 游泳 哪个运动比较对长高有帮助? 游泳和篮球哪个长高 我女朋友要去日本小清水工作了,但是她们每个人要说一段日语介绍_百度知 ... 中文翻译成日文!!答得好有追加!! 有谁能帮我用日语写一段新学期的开场白? 大黑山杜鹃坡怎么走 凤凰山-杜鹃坡旅游服务地址在哪里? 无为法有为法 联想a830开发人员选项隐藏内容怎么打开 如何编程求N个数的最大公约数 锅炉烟气中硫酸的露点是多少? 如何打开Native层的LOGV 如何在ANDROID JNI 的C++中打Log c++ 整型转化成字符型 Android中的Zygote进程有几个?Zygote能fork出Zygo... 【求助】Android如何才能录制出ogg格式的音频文件? Java程序 android log.v能打印十六进制的数据 均相化学反应的速率定律 高等数学式子变换 #define Trace logv_SysInfo(10, 1, __FILE__, __L... logv=2.42求v是多少 怎么算是违法解除劳动合同 怎样解除劳动合同才算合法? 合同快到了,想领失业金,怎样才能算解除劳动合同 如何正确解除劳动合同 怎样算终止劳动合同? 什么才算违法解除或者终止劳动合同 怎样才算与单位解除劳动合同? 应该如何解除劳动关系 如何在android 系统 C/C++ 层中添加 log 信息 android中camera的hal模块怎么被调用 我初学c语言 我用Dev c++写了个算术程序 #include ... 在Android开发中,Logcat是什么? 安卓如何打开/dev/input/event0 松树有多少品种呢? 松树一棵值多少钱? 我国的松树有多少种? 松树有多少个品种? 松树有几种 苹果手机系统更新升级后 连不上wifi怎么办 怎么团购美食上饭店去吃需要拿什么,用先付款吗,还... 怎么在网上团购美食 团购美食具体是什么一个流程? 从购买下来团购券以... 人气美食怎么团购 松树一颗能值多少钱? 糯米网美食团购怎么操作 松树有多少种类型? 松树一般多少钱一颗? 拉手网怎么团购美食?是怎样付款的呢?