参考文件:
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"

namespace android{

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;
    }
  //getService

  //打开驱动,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++实现_编写程序的更多相关文章

  1. 9.8 Binder系统_c++实现_内部机制1

    1. 内部机制_回顾binder框架关键点 binder进程通讯过程情景举例: test_server通过addservice向service_manager注册服务 test_client通过get ...

  2. 9.1 Binder系统_C程序示例_框架分析和编写程序

    IPC : Inter-Process Communication, 进程间通信 A进程把数据原原本本的发给B,这就是IPC RPC : Remote Procedure Call, 远程过程调用 A ...

  3. 9.13 Binder系统_Java实现_内部机制_Server端

    logcat TestServer:* TestClient:* HelloService:* *:S &CLASSPATH=/mnt/android_fs/TestServer.jar ap ...

  4. 9.12 Binder系统_Java实现_内部机制_Client端

    Java实现中client端的RPC层(java实现)如何通过JNI来调用IPC层(C++实现)发送数据 TestServer通过addService向Service_manager注册的时候Test ...

  5. 9.2 Binder系统_驱动情景分析_服务注册过程

    1. 几个重要结构体的引入给test_server添加一个goodbye服务, 由此引入以下概念: 进程间通信其实质也是需要三要素:源.目的.数据,源是自己,目的用handle表示:通讯的过程是源向实 ...

  6. 9.11 Binder系统_分层

    1.Binder系统过程分析,情景分析 server提供服务 (1)addService(服务名称,xxx)执行后会导致binder驱动在server的内核空间为服务创建一个binder_node结构 ...

  7. Android系统--Binder系统具体框架分析(一)

    Binder系统具体框架分析(一) 一.Binder系统核心框架 1. IPC:Inter-Process Communication, 进程间通信 A进程将数据原原本本发送B进程,主要负责进程间数据 ...

  8. C#读写文件的方法汇总_C#教程_脚本之家

    C#读写文件的方法汇总_C#教程_脚本之家 http://www.jb51.net/article/34936.htm

  9. Android系统--Binder系统具体框架分析(二)Binder驱动情景分析

    Android系统--Binder系统具体框架分析(二)Binder驱动情景分析 1. Binder驱动情景分析 1.1 进程间通信三要素 源 目的:handle表示"服务",即向 ...

随机推荐

  1. android framework 02

    Android底层开发1.安装Ubuntu系统2.Ubuntu配置开发环境: sudo apt-get install git-core gnupg flex bison gperf zip sudo ...

  2. c++值传递,指针传递,引用传递以及指针与引用的区别

    值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入, 不能传出.当函数内部需要修改参数,并且不希望这个改变影 ...

  3. 利用css去除input按钮上的文字的几种方法

    相信很多时候input上的文字困扰着web前端开发者,必须要通过修改html代码中的value值才能清空按钮上的文字,但很多人不愿意去动html代码,一方面麻烦,另外主要的原因还在于保留文字对seo有 ...

  4. CDQZ 0003:jubeeeeeat

    0003:jubeeeeeat 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  256000kB 描述 众所周知,LZF很喜欢打一个叫Jubeat的游戏.这是个音乐游戏,游戏界面是 ...

  5. css3--根据数据加载显示的一个动画

    css: .circle { width: 200px; height: 200px; position: absolute; border-radius: 50%; background: #0cc ...

  6. 【习题 8-14 UVA - 1616】Caravan Robbers

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 二分长度. 显然长度越长.就越不可能. 二分的时候.可以不用管精度. 直接指定一个二分次数的上限就好. 判断长度是否可行.直接用贪心 ...

  7. 洛谷 P1400 塔

    P1400 塔 题目描述 有N(2<=N<=600000)块砖,要搭一个N层的塔,要求:如果砖A在砖B上面,那么A不能比B的长度+D要长.问有几种方法,输出 答案 mod 10000000 ...

  8. Swift视频教程,Swift千人学iOS开发编程语言

    此时大家站在同一起跑线.Swift语言将将是下一个风靡程序猿界的编程语言,是否能抢占先机,近在咫尺. 本期推荐Swift编程语言视频教程,内容包含:开发环境基本使用.数据类型和常量.数据自己主动检查和 ...

  9. git 工具的使用总结(5)-查看历史记录

    1.查看历史记录git log 1)不加参数,显示的就是节点号,作者,日期,注释 commit b7b310d220628530d1feb9e8046ccb59039d59f2 Author: zha ...

  10. MSSQL相关用法

    一.分页查询 方式一(row_number): SELECT TOP pageSize * FROM (SELECT row_number() OVER (ORDER BY orderColumn) ...