mkdir testbinder  //创建testbinder目录

Android.mk

[plain] view plaincopy
  1. include $(call all-subdir-makefiles)

一、接口类

mkdir interface  //创建interface目录,存放接口类

Itestbinder.h

[cpp] view plaincopy
  1. #include <binder/IInterface.h>
  2. namespace android{
  3. class Itestbinder : public IInterface{
  4. public:
  5. DECLARE_META_INTERFACE(testbinder);
  6. virtual int testinterface(int a) = 0;
  7. };
  8. /
  9. class Bntestbinder : public BnInterface<Itestbinder>{
  10. public:
  11. virtual status_t    onTransact( uint32_t code,
  12. const Parcel& data,
  13. Parcel* reply,
  14. uint32_t flags = 0);
  15. };
  16. }

Itestbinder.cpp

[cpp] view plaincopy
  1. #include "Itestbinder.h"
  2. #include <binder/Parcel.h>
  3. #include <binder/IInterface.h>
  4. namespace android{
  5. enum {
  6. TEST_INTERFACE,
  7. };
  8. //客户端
  9. class Bptestbinder : public BpInterface<Itestbinder>{
  10. public:
  11. Bptestbinder(const sp<IBinder>& impl) : BpInterface<Itestbinder>(impl){
  12. }
  13. virtual int testinterface(int a){
  14. LOGD("TK---->>>>>>Itestbinder.cpp>>>>Bptestbinder::testinterface\n");
  15. Parcel data,reply;
  16. data.writeInt32(a);
  17. remote()->transact(TEST_INTERFACE,data,&reply);
  18. return reply.readInt32();
  19. }
  20. };
  21. IMPLEMENT_META_INTERFACE(testbinder, "android.test.Itestbinder");
  22. /服务端
  23. status_t Bntestbinder::onTransact(
  24. uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags){
  25. LOGD("TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact\n");
  26. switch (code) {
  27. case TEST_INTERFACE:{
  28. //CHECK_INTERFACE(Itestbinder, data, reply);
  29. LOGD("TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact>>111\n");
  30. reply->writeInt32(testinterface((int) data.readInt32()) );
  31. return NO_ERROR;
  32. } break;
  33. default:{
  34. LOGD("TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact>>222\n");
  35. return BBinder::onTransact(code, data, reply, flags);
  36. }
  37. }
  38. }
  39. }

二、客户端实现

mkdir client  //创建client目录,这个是client的实现

client.h

[cpp] view plaincopy
  1. #include "../interface/Itestbinder.h"
  2. namespace android{
  3. class client{
  4. public:
  5. static const sp<Itestbinder>& get_test_binder();
  6. static sp<Itestbinder> gtestbinder;
  7. };
  8. }

client.cpp

[cpp] view plaincopy
  1. #include "client.h"
  2. #include <binder/IServiceManager.h>
  3. #include <utils/Log.h>
  4. #include <stdio.h>
  5. namespace android{
  6. sp<Itestbinder> client::gtestbinder;
  7. const sp<Itestbinder>& client::get_test_binder(){
  8. if (gtestbinder == 0) {
  9. sp<IServiceManager> sm = defaultServiceManager();
  10. sp<IBinder> binder;
  11. do {
  12. binder = sm->getService(String16("test.Itestbinder"));
  13. if (binder != 0)
  14. break;
  15. printf("testbinder not published, waiting...");
  16. usleep(500000); // 0.5 s
  17. } while (true);
  18. gtestbinder = interface_cast<Itestbinder>(binder);
  19. }
  20. if(gtestbinder==0) printf("no testbinder!?");
  21. return gtestbinder;
  22. }
  23. }

main.cpp

[cpp] view plaincopy
  1. #include <stdio.h>
  2. #include "client.h"
  3. using namespace android;
  4. int main(int argc, char* argv[]){
  5. client* myclient = new client();
  6. if(myclient == NULL) return 0;
  7. const sp<Itestbinder>& tb = myclient->get_test_binder();
  8. if(tb == NULL) return 0;
  9. int a = tb->testinterface(3);
  10. LOGD("TK-------->>>result is %d\n",a);
  11. delete myclient;
  12. return 0;
  13. }

Android.mk

[plain] view plaincopy
  1. LOCAL_PATH:= $(call my-dir)
  2. #LOCAL_CFLAGS_ALL :=-I. -I$(LOCAL_PATH)/..
  3. include $(CLEAR_VARS)
  4. LOCAL_SRC_FILES:= \
  5. client.cpp \
  6. main.cpp \
  7. ../interface/Itestbinder.cpp
  8. LOCAL_SHARED_LIBRARIES := \
  9. libui libcutils libutils libbinder libsonivox libicuuc libexpat \
  10. libdl
  11. LOCAL_MODULE:= client
  12. LOCAL_MODULE_TAGS := optional
  13. include $(BUILD_EXECUTABLE)

三、服务端

mkdir server  //创建server目录,这个是服务端实现

testbinder.h

[cpp] view plaincopy
  1. #include "../interface/Itestbinder.h"
  2. #include <binder/BinderService.h>
  3. namespace android{
  4. class testbinder:
  5. public BinderService<testbinder>,
  6. public Bntestbinder{
  7. friend class BinderService<testbinder>;
  8. public:
  9. static const char* getServiceName() { return "test.Itestbinder"; }
  10. virtual int testinterface(int a);
  11. virtual     status_t    onTransact(
  12. uint32_t code,
  13. const Parcel& data,
  14. Parcel* reply,
  15. uint32_t flags);
  16. };
  17. }

testbinder.cpp

[cpp] view plaincopy
  1. #include <binder/IPCThreadState.h>
  2. #include <binder/IServiceManager.h>
  3. #include <utils/Log.h>
  4. //#include <utils/Trace.h>
  5. #include <binder/Parcel.h>
  6. #include <binder/IPCThreadState.h>
  7. #include <utils/String16.h>
  8. #include <utils/threads.h>
  9. #include <utils/Atomic.h>
  10. //#include <cutils/bitops.h>
  11. #include <cutils/properties.h>
  12. #include <cutils/compiler.h>
  13. #include "testbinder.h"
  14. namespace android{
  15. int testbinder::testinterface(int a){
  16. LOGD("TK---->>>>>>testbinder.cpp>>>>testbinder::testinterface\n");
  17. return a+2;
  18. }
  19. status_t testbinder::onTransact(
  20. uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags){
  21. LOGD("TK---->>>>>>testbinder.cpp>>>>testbinder::onTransact\n");
  22. return Bntestbinder::onTransact(code, data, reply, flags);
  23. }
  24. }

main.cpp

[cpp] view plaincopy
  1. #include <binder/IPCThreadState.h>
  2. #include <binder/ProcessState.h>
  3. #include <binder/IServiceManager.h>
  4. #include <utils/Log.h>
  5. #include "testbinder.h"
  6. using namespace android;
  7. int main(int argc, char** argv)
  8. {
  9. sp<ProcessState> proc(ProcessState::self());
  10. sp<IServiceManager> sm = defaultServiceManager();
  11. LOGI("ServiceManager: %p", sm.get());
  12. testbinder::instantiate();
  13. ProcessState::self()->startThreadPool();
  14. IPCThreadState::self()->joinThreadPool();
  15. return 0;
  16. }

Android.mk

[plain] view plaincopy
  1. LOCAL_PATH:= $(call my-dir)
  2. #LOCAL_CFLAGS_ALL :=-I. -I$(LOCAL_PATH)/..
  3. include $(CLEAR_VARS)
  4. LOCAL_SRC_FILES:= \
  5. main.cpp \
  6. testbinder.cpp \
  7. ../interface/Itestbinder.cpp
  8. LOCAL_SHARED_LIBRARIES := \
  9. libui libcutils libutils libbinder libsonivox libicuuc libexpat \
  10. libdl
  11. LOCAL_MODULE:= server
  12. LOCAL_MODULE_TAGS := optional
  13. include $(BUILD_EXECUTABLE)

四、运行

./server

./client

结果:

[plain] view plaincopy
  1. result:
  2. 1.client
  3. root@android:/data # ./client
  4. TK---->>>>>>Itestbinder.cpp>>>>Bptestbinder::testinterface
  5. TK-------->>>result is 4
  6. 2.server
  7. root@android:/data # ./server
  8. TK---->>>>>>testbinder.cpp>>>>testbinder::onTransact
  9. TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact
  10. TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact>>111
  11. TK---->>>>>>testbinder.cpp>>>>testbinder::testinterface
  12. =============================================================
  13. I/        (  624): ServiceManager: 0xc708
  14. D/        (  626): TK---->>>>>>Itestbinder.cpp>>>>Bptestbinder::testinterface
  15. D/        (  624): TK---->>>>>>testbinder.cpp>>>>testbinder::onTransact
  16. D/        (  624): TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact
  17. D/        (  624): TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact>>111
  18. D/        (  624): TK---->>>>>>testbinder.cpp>>>>testbinder::testinterface
  19. D/        (  626): TK-------->>>result is 5

Android Binder机制的Native应用相关推荐

  1. Android Binder机制的Native应用—双向通信

    mkdir testbinder  //创建testbinder目录 Android.mk [plain] view plaincopy include $(call all-subdir-makef ...

  2. 理解Android Binder机制(3/3):Java层

    本文是Android Binder机制解析的第三篇,也是最后一篇文章.本文会讲解Binder Framework Java部分的逻辑. Binder机制分析的前面两篇文章,请移步这里: 理解Andro ...

  3. Android Binder机制情景源码分析之Binder回调注册和反注册

    我们在日常开发中,经常用到Binder来进行跨进程通信,有个比较常见的场景是向服务端注册Binder回调,比如: IActivityManager中有两个成对的方法,Client端向AMS所在的服务端 ...

  4. aidl使用_借助 AIDL 理解 Android Binder 机制——Binder 来龙去脉

    AIDL 是 Android Interface Definition Language(Android 接口定义语言)的缩写,它是 Android 进程间通信的接口语言.由于 Android 系统的 ...

  5. 【Binder 机制】Native 层 Binder 机制分析 ( binder_loop | svcmgr_handler | binder.c | binder_parse )

    文章目录 前言 一.binder_loop 方法调用 二.binder_loop 方法参数 svcmgr_handler 三.binder_loop 方法 四.binder_parse 方法 前言 在 ...

  6. 理解Android Binder机制(1/3):驱动篇

    Binder的实现是比较复杂的,想要完全弄明白是怎么一回事,并不是一件容易的事情. 这里面牵涉到好几个层次,每一层都有一些模块和机制需要理解.这部分内容预计会分为三篇文章来讲解.本文是第一篇,首先会对 ...

  7. Android Binder机制学习笔记

    声明,学习材料:http://my.unix-center.net/~Simon_fu/?p=875,不是简单的copy 1    Android的进程间通讯机制(IPC)用的是自己的binder机制 ...

  8. Android - Binder机制 - Binder框架总结

    以下几篇文章是较深入分析binder机制. 目录 1. Android - Binder机制 - ServiceManager 2. Android - Binder机制 - 普通service注册 ...

  9. 【Binder 机制】Native 层 Binder 机制分析 ( service_manager.c | 开启 Binder | 注册 Binder 进程上下文 | 开启 Binder 循环 )

    文章目录 一.系统服务 二.系统服务主函数 三.开启 Binder 四.注册上下文 五.开启 Binder 循环 六.binder_write 方法 七.binder_ioctl 内核方法 八.bin ...

最新文章

  1. SAP RETAIL 如何查看分配表是参考哪个PO来创建的?
  2. Python编译出现错误SyntaxError: Non-ASCII character '\xe7' 时解决方法
  3. android功能导航布局,安卓9.0新功能 屏幕旋转将与导航栏同窗
  4. java 解决故意弄得错误,高效的Java错误处理
  5. 如何用WinCC发送报警消息至钉钉
  6. 【转帖】MATLAB中用FDATool设计滤波器及使用
  7. Linux系统下zookeeper的安装和配置
  8. SQL Server 2008 R2
  9. Java基础学习总结(70)——开发Java项目常用的工具汇总
  10. linux otl mysql_Linux下用OTL操作MySql(包含自己封装的类库及演示样例代码下载)...
  11. C# 利用 OleDb 组件操作 Excel 进行文件读写操作
  12. Android Retrofit的学习
  13. 通信原理day7:第三章:抽样;均匀量化;非均匀量化;A律;增量(ΔM)调制
  14. 学会在Android Studio里使用列表视图制作通讯录
  15. 对PyramidBox的理解
  16. 【python练习题3】英雄联盟英雄购买界面+数字炸弹游戏
  17. flutter 实现切屏横竖屏切换
  18. socket.io简易教程(群聊,发送图片,分组,私聊)
  19. [含论文+源码等]ssm框架外卖订餐系统
  20. 永中Office的魅力何在?

热门文章

  1. 读取Excel文件的版本
  2. wince BindingSource
  3. Meteor资源国外优秀web APP 收藏
  4. localForage Web 离线存储
  5. size()和 strlen区别
  6. python类型转换方法_整理了最全的Python3数据类型转换方法,可以收藏当手册用...
  7. 华理c语言设计网上作业,华理c程序实验报告(共9篇).doc
  8. 网关 跨域_好文推荐:微服务网关实战—Spring Cloud Gateway
  9. 三十六.MHA集群概述 、 部署MHA集群 测试配置
  10. springboot开篇 (一)简单邮件发送