Android Binder机制的Native应用
Android.mk
- include $(call all-subdir-makefiles)
一、接口类
mkdir interface //创建interface目录,存放接口类
Itestbinder.h
- #include <binder/IInterface.h>
- namespace android{
- class Itestbinder : public IInterface{
- public:
- DECLARE_META_INTERFACE(testbinder);
- virtual int testinterface(int a) = 0;
- };
- /
- class Bntestbinder : public BnInterface<Itestbinder>{
- public:
- virtual status_t onTransact( uint32_t code,
- const Parcel& data,
- Parcel* reply,
- uint32_t flags = 0);
- };
- }
Itestbinder.cpp
- #include "Itestbinder.h"
- #include <binder/Parcel.h>
- #include <binder/IInterface.h>
- namespace android{
- enum {
- TEST_INTERFACE,
- };
- //客户端
- class Bptestbinder : public BpInterface<Itestbinder>{
- public:
- Bptestbinder(const sp<IBinder>& impl) : BpInterface<Itestbinder>(impl){
- }
- virtual int testinterface(int a){
- LOGD("TK---->>>>>>Itestbinder.cpp>>>>Bptestbinder::testinterface\n");
- Parcel data,reply;
- data.writeInt32(a);
- remote()->transact(TEST_INTERFACE,data,&reply);
- return reply.readInt32();
- }
- };
- IMPLEMENT_META_INTERFACE(testbinder, "android.test.Itestbinder");
- /服务端
- status_t Bntestbinder::onTransact(
- uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags){
- LOGD("TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact\n");
- switch (code) {
- case TEST_INTERFACE:{
- //CHECK_INTERFACE(Itestbinder, data, reply);
- LOGD("TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact>>111\n");
- reply->writeInt32(testinterface((int) data.readInt32()) );
- return NO_ERROR;
- } break;
- default:{
- LOGD("TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact>>222\n");
- return BBinder::onTransact(code, data, reply, flags);
- }
- }
- }
- }
二、客户端实现
mkdir client //创建client目录,这个是client的实现
client.h
- #include "../interface/Itestbinder.h"
- namespace android{
- class client{
- public:
- static const sp<Itestbinder>& get_test_binder();
- static sp<Itestbinder> gtestbinder;
- };
- }
client.cpp
- #include "client.h"
- #include <binder/IServiceManager.h>
- #include <utils/Log.h>
- #include <stdio.h>
- namespace android{
- sp<Itestbinder> client::gtestbinder;
- const sp<Itestbinder>& client::get_test_binder(){
- if (gtestbinder == 0) {
- sp<IServiceManager> sm = defaultServiceManager();
- sp<IBinder> binder;
- do {
- binder = sm->getService(String16("test.Itestbinder"));
- if (binder != 0)
- break;
- printf("testbinder not published, waiting...");
- usleep(500000); // 0.5 s
- } while (true);
- gtestbinder = interface_cast<Itestbinder>(binder);
- }
- if(gtestbinder==0) printf("no testbinder!?");
- return gtestbinder;
- }
- }
main.cpp
- #include <stdio.h>
- #include "client.h"
- using namespace android;
- int main(int argc, char* argv[]){
- client* myclient = new client();
- if(myclient == NULL) return 0;
- const sp<Itestbinder>& tb = myclient->get_test_binder();
- if(tb == NULL) return 0;
- int a = tb->testinterface(3);
- LOGD("TK-------->>>result is %d\n",a);
- delete myclient;
- return 0;
- }
Android.mk
- LOCAL_PATH:= $(call my-dir)
- #LOCAL_CFLAGS_ALL :=-I. -I$(LOCAL_PATH)/..
- include $(CLEAR_VARS)
- LOCAL_SRC_FILES:= \
- client.cpp \
- main.cpp \
- ../interface/Itestbinder.cpp
- LOCAL_SHARED_LIBRARIES := \
- libui libcutils libutils libbinder libsonivox libicuuc libexpat \
- libdl
- LOCAL_MODULE:= client
- LOCAL_MODULE_TAGS := optional
- include $(BUILD_EXECUTABLE)
三、服务端
mkdir server //创建server目录,这个是服务端实现
testbinder.h
- #include "../interface/Itestbinder.h"
- #include <binder/BinderService.h>
- namespace android{
- class testbinder:
- public BinderService<testbinder>,
- public Bntestbinder{
- friend class BinderService<testbinder>;
- public:
- static const char* getServiceName() { return "test.Itestbinder"; }
- virtual int testinterface(int a);
- virtual status_t onTransact(
- uint32_t code,
- const Parcel& data,
- Parcel* reply,
- uint32_t flags);
- };
- }
testbinder.cpp
- #include <binder/IPCThreadState.h>
- #include <binder/IServiceManager.h>
- #include <utils/Log.h>
- //#include <utils/Trace.h>
- #include <binder/Parcel.h>
- #include <binder/IPCThreadState.h>
- #include <utils/String16.h>
- #include <utils/threads.h>
- #include <utils/Atomic.h>
- //#include <cutils/bitops.h>
- #include <cutils/properties.h>
- #include <cutils/compiler.h>
- #include "testbinder.h"
- namespace android{
- int testbinder::testinterface(int a){
- LOGD("TK---->>>>>>testbinder.cpp>>>>testbinder::testinterface\n");
- return a+2;
- }
- status_t testbinder::onTransact(
- uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags){
- LOGD("TK---->>>>>>testbinder.cpp>>>>testbinder::onTransact\n");
- return Bntestbinder::onTransact(code, data, reply, flags);
- }
- }
main.cpp
- #include <binder/IPCThreadState.h>
- #include <binder/ProcessState.h>
- #include <binder/IServiceManager.h>
- #include <utils/Log.h>
- #include "testbinder.h"
- using namespace android;
- int main(int argc, char** argv)
- {
- sp<ProcessState> proc(ProcessState::self());
- sp<IServiceManager> sm = defaultServiceManager();
- LOGI("ServiceManager: %p", sm.get());
- testbinder::instantiate();
- ProcessState::self()->startThreadPool();
- IPCThreadState::self()->joinThreadPool();
- return 0;
- }
Android.mk
- LOCAL_PATH:= $(call my-dir)
- #LOCAL_CFLAGS_ALL :=-I. -I$(LOCAL_PATH)/..
- include $(CLEAR_VARS)
- LOCAL_SRC_FILES:= \
- main.cpp \
- testbinder.cpp \
- ../interface/Itestbinder.cpp
- LOCAL_SHARED_LIBRARIES := \
- libui libcutils libutils libbinder libsonivox libicuuc libexpat \
- libdl
- LOCAL_MODULE:= server
- LOCAL_MODULE_TAGS := optional
- include $(BUILD_EXECUTABLE)
四、运行
./server
./client
结果:
- result:
- 1.client
- root@android:/data # ./client
- TK---->>>>>>Itestbinder.cpp>>>>Bptestbinder::testinterface
- TK-------->>>result is 4
- 2.server
- root@android:/data # ./server
- TK---->>>>>>testbinder.cpp>>>>testbinder::onTransact
- TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact
- TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact>>111
- TK---->>>>>>testbinder.cpp>>>>testbinder::testinterface
- =============================================================
- I/ ( 624): ServiceManager: 0xc708
- D/ ( 626): TK---->>>>>>Itestbinder.cpp>>>>Bptestbinder::testinterface
- D/ ( 624): TK---->>>>>>testbinder.cpp>>>>testbinder::onTransact
- D/ ( 624): TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact
- D/ ( 624): TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact>>111
- D/ ( 624): TK---->>>>>>testbinder.cpp>>>>testbinder::testinterface
- D/ ( 626): TK-------->>>result is 5
Android Binder机制的Native应用相关推荐
- Android Binder机制的Native应用—双向通信
mkdir testbinder //创建testbinder目录 Android.mk [plain] view plaincopy include $(call all-subdir-makef ...
- 理解Android Binder机制(3/3):Java层
本文是Android Binder机制解析的第三篇,也是最后一篇文章.本文会讲解Binder Framework Java部分的逻辑. Binder机制分析的前面两篇文章,请移步这里: 理解Andro ...
- Android Binder机制情景源码分析之Binder回调注册和反注册
我们在日常开发中,经常用到Binder来进行跨进程通信,有个比较常见的场景是向服务端注册Binder回调,比如: IActivityManager中有两个成对的方法,Client端向AMS所在的服务端 ...
- aidl使用_借助 AIDL 理解 Android Binder 机制——Binder 来龙去脉
AIDL 是 Android Interface Definition Language(Android 接口定义语言)的缩写,它是 Android 进程间通信的接口语言.由于 Android 系统的 ...
- 【Binder 机制】Native 层 Binder 机制分析 ( binder_loop | svcmgr_handler | binder.c | binder_parse )
文章目录 前言 一.binder_loop 方法调用 二.binder_loop 方法参数 svcmgr_handler 三.binder_loop 方法 四.binder_parse 方法 前言 在 ...
- 理解Android Binder机制(1/3):驱动篇
Binder的实现是比较复杂的,想要完全弄明白是怎么一回事,并不是一件容易的事情. 这里面牵涉到好几个层次,每一层都有一些模块和机制需要理解.这部分内容预计会分为三篇文章来讲解.本文是第一篇,首先会对 ...
- Android Binder机制学习笔记
声明,学习材料:http://my.unix-center.net/~Simon_fu/?p=875,不是简单的copy 1 Android的进程间通讯机制(IPC)用的是自己的binder机制 ...
- Android - Binder机制 - Binder框架总结
以下几篇文章是较深入分析binder机制. 目录 1. Android - Binder机制 - ServiceManager 2. Android - Binder机制 - 普通service注册 ...
- 【Binder 机制】Native 层 Binder 机制分析 ( service_manager.c | 开启 Binder | 注册 Binder 进程上下文 | 开启 Binder 循环 )
文章目录 一.系统服务 二.系统服务主函数 三.开启 Binder 四.注册上下文 五.开启 Binder 循环 六.binder_write 方法 七.binder_ioctl 内核方法 八.bin ...
最新文章
- SAP RETAIL 如何查看分配表是参考哪个PO来创建的?
- Python编译出现错误SyntaxError: Non-ASCII character '\xe7' 时解决方法
- android功能导航布局,安卓9.0新功能 屏幕旋转将与导航栏同窗
- java 解决故意弄得错误,高效的Java错误处理
- 如何用WinCC发送报警消息至钉钉
- 【转帖】MATLAB中用FDATool设计滤波器及使用
- Linux系统下zookeeper的安装和配置
- SQL Server 2008 R2
- Java基础学习总结(70)——开发Java项目常用的工具汇总
- linux otl mysql_Linux下用OTL操作MySql(包含自己封装的类库及演示样例代码下载)...
- C# 利用 OleDb 组件操作 Excel 进行文件读写操作
- Android Retrofit的学习
- 通信原理day7:第三章:抽样;均匀量化;非均匀量化;A律;增量(ΔM)调制
- 学会在Android Studio里使用列表视图制作通讯录
- 对PyramidBox的理解
- 【python练习题3】英雄联盟英雄购买界面+数字炸弹游戏
- flutter 实现切屏横竖屏切换
- socket.io简易教程(群聊,发送图片,分组,私聊)
- [含论文+源码等]ssm框架外卖订餐系统
- 永中Office的魅力何在?
热门文章
- 读取Excel文件的版本
- wince BindingSource
- Meteor资源国外优秀web APP 收藏
- localForage Web 离线存储
- size()和 strlen区别
- python类型转换方法_整理了最全的Python3数据类型转换方法,可以收藏当手册用...
- 华理c语言设计网上作业,华理c程序实验报告(共9篇).doc
- 网关 跨域_好文推荐:微服务网关实战—Spring Cloud Gateway
- 三十六.MHA集群概述 、 部署MHA集群 测试配置
- springboot开篇 (一)简单邮件发送