9.7 Binder系统_c++实现_编写程序
参考文件:
frameworks\av\include\media\IMediaPlayerService.h (IMediaPlayerService,BnMediaPlayerService)
frameworks\av\media\libmedia\IMediaPlayerService.cpp (BpMediaPlayerService)
frameworks\av\media\libmediaplayerservice\MediaPlayerService.h
frameworks\av\media\libmediaplayerservice\MediaPlayerService.cpp
frameworks\av\media\mediaserver\Main_mediaserver.cpp (server, addService)
IHelloService.h:(参考:IMediaPlayerService.h)
ifndef ANDROID_IHELLOERVICE_H
#define ANDROID_IHELLOERVICE_H
................头文件..................
namespace android{
#define HELLO_SVR_CMD_SAYHELLO 1
#define HELLO_SVR_CMD_SAYHELLO_TO 2
class IHelloService:public IInterface
{
public:
DECLARE_META_INTERFACE(HelloService);
virtual void sayhello(void) = 0;
virtual int sayhello_to(const char *name) = 0;
};
class BnHelloService:public BnInterface<IHelloService>
{
public:
virtual status_t onTransact(uint32_t code,const Parcel& data,Parcel* reply,uint32_t flags = 0);
virtual void sayhello(void);
virtual int sayhello_to(const char *name);
}
}
#endfi
BnHelloService.cpp(参考:IMediaPlayerService.cpp)
#include LOG_TAG "HelloService"
#include "IHelloService.h"
namespace android{
status_t BnHelloService::onTransact(uint32_t code,const Parcel& data,Parcel* reply,uint32_t flags)
{
//解析数据,调用sayhello/sayhello_to
switch(code){
case HELLO_SVR_CMD_SAYHELLO:{
sayhello();
return NO_ERROR;
}
case HELLO_SVR_CMD_SAYHELLO_TO:{
//从data中取出参数
int32_t policy = data->readInt32();//把四字节的全零数据读出来
String16 name16 =data->readString16();
String8 name8(name16);
int cnt = sayhello_to(name8.string());
//把返回值写入reply传回去
reply->writeInt32(cnt);
return NO_ERROR;
}breakl
default:
return BBinder::onTransact(code,data,reply,flags);
}
}
void BnHelloService::sayhello(void);
{
static int cnt = 0;
ALOGI("say hello : %d\n", ++cnt);}
int BnHelloService::sayhello_to(const char *name);
{
static int cnt = 0; ALOGI("say hello to %s : %d\n", name, ++cnt); return cnt;}
}
BpHelloService.cpp(参考:IMediaPlayerService.cpp)
#include "IHelloService.h"
class BpHelloService:public BpInterface<IHelloService>
{
public:
BpHelloService(const sp<IBinder>& impl):BpInterface<IHelloService>(impl)
{
}
void sayhello(void)
{
//构造/发送数据
Parcel data,reply;
data.writeInt32(0);//data数据域可以自己定义,这里是为了统一
remote()->transact(HELLO_SVR_CMD_SAYHELLO,data,&reply);
}
void sayhello_to(const char *name)
{
//构造/发送数据
Parcel data,reply;
data.writeInt32(0);//data数据域可以自己定义,这里是为了统一
data.writeString16(String16(name));
remote()->transact(HELLO_SVR_CMD_SAYHELLO_TO,data,&reply);
return reply.readInt32(HelloService,"android.media.IMediaPlayerService");
}
}
IMPLEMENT_META_INTERFACE(HelloService,"android.meida.In");
}
test_server.cpp(参考:Main_mediaserver.cpp)
#define LOG_TAG “HelloService”
#include "IHelloService.h"
.................头文件.......................
using namespace android;
int main(void)
{
//add service //while(1){read data,解析数据,调用服务函数}
//打开驱动,mmap
sp<ProcessState> proc(ProcessState::self());
//获得BpServiceManager
sp<IServiceManager> sm = defaultServiceManager();
sm->addService(String16("hello"),new BnHelloService());
//循环体
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
return 0;
}
test_client.cpp
#define LOG_TAG “HelloService”
#include "IHelloService.h"
.................头文件.......................
using namespace android;
void main(int argc,char **argv)
{
int cnt; if (argc < 2){ ALOGI(stderr, "Usage:\n"); ALOGI(stderr, "%s hello\n", argv[0]); ALOGI(stderr, "%s hello <name>\n", argv[0]); return -1; }//打开驱动,mmap
sp<ProcessState> proc(ProcessState::self());
//获得BpServiceManager
sp<IServiceManager> sm = defaultServiceManager();
sp<IBinder> binder = sm->getService(String16("hello"));
if(binder == 0)
{
ALOGI("can't get hello service\n");
return -1;
}
//service肯定是BpHelloService指针
sp<IHelloService> service = interface_cast<IHelloService>(binder);
//调用Service函数
if(argc < 3){
service->sayhello();
ALOGI("client call sayhello");
}
else{
cnt = service->sayhello_to(argv[2]);
ALOGI("client call sayhello_to,cnt = %d ",cnt);
}
return 0;
}
测试编译:
参考frameworks\av\media\mediaserver\Android.mk
编译:
a. 文件放入frameworks/testing/APP_0004_Binder_CPP_App
b. cd /work/android-5.0.2/
. setenv
lunch //选择23. full_tiny4412-eng
c. cd frameworks/testing/APP_0004_Binder_CPP_App
mmm .
测试:
a. 重新编译内核让它支持NFS
make menuconfig
<*> NFS client support | |
[*] NFS client support for NFS version 3 | |
[*] NFS client support for the NFSv3 ACL protocol extension | |
[*] NFS client support for NFS version 4 | |
[*] NFS client support for NFSv4.1 (EXPERIMENTAL)
make zImage, 并使用新的zImage启动单板
b. mount nfs
su
ifconfig eth0 192.168.1.100
busybox mount -t nfs -o nolock,vers=2 192.168.1.123:/work/nfs_root /mnt
c. 执行 test_server, test_client
./test_server &
logcat HelloService:* *:S &
./test_client hello
./test_client hello weidongshan
9.7 Binder系统_c++实现_编写程序的更多相关文章
- 9.8 Binder系统_c++实现_内部机制1
1. 内部机制_回顾binder框架关键点 binder进程通讯过程情景举例: test_server通过addservice向service_manager注册服务 test_client通过get ...
- 9.1 Binder系统_C程序示例_框架分析和编写程序
IPC : Inter-Process Communication, 进程间通信 A进程把数据原原本本的发给B,这就是IPC RPC : Remote Procedure Call, 远程过程调用 A ...
- 9.13 Binder系统_Java实现_内部机制_Server端
logcat TestServer:* TestClient:* HelloService:* *:S &CLASSPATH=/mnt/android_fs/TestServer.jar ap ...
- 9.12 Binder系统_Java实现_内部机制_Client端
Java实现中client端的RPC层(java实现)如何通过JNI来调用IPC层(C++实现)发送数据 TestServer通过addService向Service_manager注册的时候Test ...
- 9.2 Binder系统_驱动情景分析_服务注册过程
1. 几个重要结构体的引入给test_server添加一个goodbye服务, 由此引入以下概念: 进程间通信其实质也是需要三要素:源.目的.数据,源是自己,目的用handle表示:通讯的过程是源向实 ...
- 9.11 Binder系统_分层
1.Binder系统过程分析,情景分析 server提供服务 (1)addService(服务名称,xxx)执行后会导致binder驱动在server的内核空间为服务创建一个binder_node结构 ...
- Android系统--Binder系统具体框架分析(一)
Binder系统具体框架分析(一) 一.Binder系统核心框架 1. IPC:Inter-Process Communication, 进程间通信 A进程将数据原原本本发送B进程,主要负责进程间数据 ...
- C#读写文件的方法汇总_C#教程_脚本之家
C#读写文件的方法汇总_C#教程_脚本之家 http://www.jb51.net/article/34936.htm
- Android系统--Binder系统具体框架分析(二)Binder驱动情景分析
Android系统--Binder系统具体框架分析(二)Binder驱动情景分析 1. Binder驱动情景分析 1.1 进程间通信三要素 源 目的:handle表示"服务",即向 ...
随机推荐
- .net运行项目的几种形式
1.通过配置IIS 2.通过VS运行项目 3.发布到测试服务器 不同于PHP的发布,直接把相关的类文件传入ftp即可. .net的发布是编译好dll文件,将dll文件传入即可. 比如改了某个文件,就把 ...
- 用select标签实现跳转
用select标签实现跳转 一.用select标签实现跳转JavaScript代码 我们经常有遇到需要用select标签跳转到新网页的情况,dw生成的代码太复杂,那么有没有精简的代码得以实现呢?经过仔 ...
- Android Retrofit+RxJava 优雅的处理服务器返回异常、错误
标签: 开始本博客之前,请先阅读: Retrofit请求数据对错误以及网络异常的处理 异常&错误 实际开发经常有这种情况,比如登录请求,接口返回的 信息包括请求返回的状态:失败还是成功,错误码 ...
- cat---查看文件内容
- nice---进程优先级
在当前程序运行优先级基础之上调整指定值得到新的程序运行优先级,用新的程序运行优先级运行命令行"command [arguments...]".优先级的范围为-20 - 19 等40 ...
- 03004_SQL语句
1.SQL语法 (1)数据库是不认识JAVA语言的,但是我们同样要与数据库交互,这时需要使用到数据库认识的语言SQL语句,它是数据库的代码: (2)结构化查询语言(Structured Query L ...
- C++异常实现与longjmp, setjmp,栈指针EBP, Active Record
这篇讲的不错: http://blog.csdn.net/smstong/article/details/50728022 首先Active Record 然后EBP,ESP等指针 2 通过setjm ...
- Day4晚笔记
数据结构 并查集:捆绑两个点的信息,判断对错 倍增:LCA, 字符串 hash,模拟, 最小表示法 给定一个环状字符串,切开,使得字符串的字典序最小 图和树 割点,割边,强联通分量 点双联通分量 (把 ...
- 新手前端笔记之--初识html标签
接触前端(好大气的名字啊)已经一个多月了,看了很多视频和博客,有了一定的感性认识,但还是需要总结一下以便系统化所学习的知识,就从html标签开始吧.关于标签,谈论最多的就是简洁和语义化.简洁指html ...
- 洛谷 P2978 [USACO10JAN]下午茶时间Tea Time
P2978 [USACO10JAN]下午茶时间Tea Time 题目描述 N (1 <= N <= 1000) cows, conveniently numbered 1..N all a ...