在android root环境下,有一个后台服务server进程需要提供接口给控制台应用client调用,本来想用socket方式来做的,后台发现android有更高效的方式来实现.那就是binder.

查了一下资料,具体的binder驱动的实现细节比较复杂,网上一堆教程都是先aidl,再生成代码,

其实不用那么复杂,下面应该是最简单写法了。

server

#include <binder/IServiceManager.h>
#include <binder/IPCThreadState.h>
#include <binder/IInterface.h>
#include <binder/Parcel.h>
#include <utils/Errors.h>
#include <pthread> using namespace android;
//客户端回调引用
sp<IBinder> clientCallback; enum {
code_test_hello = 1,
code_test_callback_registe = 2
} enum {
cb_code_test = 1
} void callback_test(const char* params) {
if (clientCallback == NULL) { \
LOGD("%s clientCallback == null", __FUNCTION__);
return;
}
if (!clientCallback->isBinderAlive()){
LOGD("%s clientCallback not alive", __FUNCTION__);
return;
} int32_t t = clientCallback->pingBinder();
bool b = clientCallback->isBinderAlive();
Parcel request, reply;
request.writeCString(params);
clientCallback->transact(EnumCallback::cb_code_test, request, &reply);
} class ServiceService: public BBinder {
public:
ServiceService();
virtual status_t onTransact(uint32_t code, const Parcel&, Parcel*, uint32_t){
switch(code) { case code_test_hello:
{
printf("from client:%s", request.readCString());
reply->writeCString("hello client");
return NO_ERROR;
}
case code_test_callback_registe:
{
clientCallback = request.readStrongBinder();
reply->writeInt32(0);
return NO_ERROR;
}
} return BBinder::onTransact(code, request, reply, flag);
}
}; void *binderThread (void *arg){
sp<ProcessState> proc(ProcessState::self());
defaultServiceManager()->addService(String16("ServiceService"), new ServiceService());
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
return ((void *)0);
} int initBinderPool() {
return pthread_create(NULL, NULL, binderThread, NULL);
} int main(int argc, char *argv[]) {
//启动binder框架线程池
initBinderPool();
while(true) {
callback_test("hello word");
sleep(1);
} return 0;
}

client

#include <binder/IServiceManager.h>
#include <binder/IPCThreadState.h>
#include <binder/Parcel.h>
#include <utils/Errors.h>
#include <stdio.h>
#include <binder/IMemory.h>
#include <binder/MemoryHeapBase.h>
#include <binder/MemoryBase.h>
#include <android/log.h> #define TAG "bindertest"
#define LOGD(...) \
printf(__VA_ARGS__); \
__android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__) using namespace android;
static sp<IBinder> service; enum {
code_test_hello = 1,
code_test_callback_registe = 2
} enum {
cb_code_test = 1
} class Callback : public BBinder {
public:
status_t onTransact(uint32_t code, const Parcel &request, Parcel *reply, uint32_t flag) {
switch (code) {
case cb_code_test:{
const char* str = request.readCString();
LOGD("msg from server cb:%s\n", str);
reply->writeInt32(0);
break;
}
} return BBinder::onTransact(code, request, reply, flag);
}
}; static void callback_connect(const sp<Callback>& callback) {
if (service == NULL) {
LOGD("[%s] service not init", __FUNCTION__);
return ret;
} Parcel request, reply;
request.writeStrongBinder(callback);
service->transact(CMD_CALLBACK_INIT, request, &reply);
} void* binderThread(void* params){
sp<ProcessState> proc(ProcessState::self());
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
return NULL;
} void testHello() {
if (service == NULL) {
LOGD("[%s] service not init", __FUNCTION__);
return ret;
} Parcel request, reply;
request.writeCString("hello server");
service->transact(code_test_hello, request, &reply);
printf("from server:%s", reply.readCString());
} int main(int argc, char *argv[]) {
sp<ProcessState> proc(ProcessState::self());
service = defaultServiceManager()->getService(String16("ServiceService"));
if (!service) {
LOGD("get ServiceService fail");
return 0;
} //注册回调
sp<Callback> callback = new Callback();
callback_connect(callback);
//启动binder线程池,不启动的话,server端的回调会卡住
pthread_create(NULL, NULL, binderThread,NULL); while(true) {
testHello();
sleep(1);
} return 0;
}

参考

http://qiushao.net/2019/12/29/Android%E7%B3%BB%E7%BB%9F%E5%BC%80%E5%8F%91%E5%85%A5%E9%97%A8/9-%E6%B7%BB%E5%8A%A0native%E7%B3%BB%E7%BB%9F%E6%9C%8D%E5%8A%A1/

android控制台应用binder通讯的更多相关文章

  1. android灭屏后调用binder通讯竟然影响了socket的POLL_OUT事件,怪事。

    当你的android在灭屏(休眠)时分派(dispatch) Ice调用过程中,如果创建了新的进程,你的响应将不会预期那样工作,尽管你已经调用 ice_response或 ice_exception, ...

  2. Android中的Binder机制的简要理解

    转载自:http://www.linuxidc.com/Linux/2012-07/66195.htm http://blog.csdn.net/sunxingzhesunjinbiao/articl ...

  3. Android深入浅出之Binder机制(转)

    Android深入浅出之Binder机制 一 说明 Android系统最常见也是初学者最难搞明白的就是Binder了,很多很多的Service就是通过Binder机制来和客户端通讯交互的.所以搞明白B ...

  4. 岁末年初3Q大战惊现高潮,360震撼推出Android "3Q" IM即时通讯

    岁末年初3Q大战惊现高潮,360震撼推出Android "3Q" IM即时通讯 看过了QQ和360斗争的开端高潮,当然现在还不能说这场斗争已经结束,在我看来这次的事件未尝不是一个适 ...

  5. 基于Android 平台简易即时通讯的研究与设计[转]

    摘要:论文简单介绍Android 平台的特性,主要阐述了基于Android 平台简易即时通讯(IM)的作用和功能以及实现方法.(复杂的通讯如引入视频音频等可以考虑AnyChat SDK~)关键词:An ...

  6. Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...

  7. 3Q大战现高潮,360 推出Android "3Q" IM即时通讯,岁末年初3Q大战惊现高潮

    岁末年初3Q大战惊现高潮,360震撼推出Android "3Q" IM即时通讯       看过了QQ和360斗争的开端高潮,当然现在还不能说这场斗争已经结束,在我看来这次的事件未 ...

  8. 从AIDL开始谈Android进程间Binder通信机制

    转自: http://tech.cnnetsec.com/585.html 本文首先概述了Android的进程间通信的Binder机制,然后结合一个AIDL的例子,对Binder机制进行了解析. 概述 ...

  9. [Android进阶]Binder学习(初始篇)

    Android中Binder学习(初始篇) 本篇博客学习自侯亮的博客.地址为: 红茶一杯话Binder 1 什么是Binder? 简单地说.Binder是Android平台上的一种跨进程交互技术. 该 ...

  10. 手把手教Android商业项目-即时通讯-i美聊

    [课程概况] 手把手教你从无到有的完整实现一个Android商业项目,是目前整个市场上所没有的课程,废话不多说,请往下看. [项目概况] 项目名称:i美聊 所属领域:移动社交 即时通讯   代码行数: ...

随机推荐

  1. 代码随想录算法训练营day21 | leetcode ● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● ***236. 二叉树的最近公共祖先

    LeetCode 530.二叉搜索树的最小绝对差 分析1.0 二叉搜索树,中序遍历形成一个升序数组,节点差最小值一定在中序遍历两个相邻节点产生 ✡✡✡ 即 双指针思想在树遍历中的应用 class So ...

  2. Python批量绘制遥感影像数据的直方图

      本文介绍基于Python中gdal模块,实现对大量栅格图像批量绘制直方图的方法.   首先,明确一下本文需要实现的需求:现需对多幅栅格数据文件进行依据其像元数值的直方图绘制,具体绘制内容即各栅格图 ...

  3. Mybatis优化

    Mybatis优化 log4j日志显示 在pom.xml中的<dependencies>标签中加入 <!--log4j日志 --> <dependency> < ...

  4. ABP微服务系列学习-对接前端界面

    前面我们把后端的微服务架子基本搭建完成并成功启动了,现在我们可以对接前端界面了.这里我们直接用ABP模板里面的Angular的前端界面. 创建应用程序模板 使用ABPCli创建一个应用程序模板,前端选 ...

  5. PACS系统各个功能介绍--九五小庞

    PACS系统是HIS系统的重要组成部分,医生可在电脑上查看患者的医学影像报告. ■ 支持心电DICOM,心电图浏览和处理(显示格式.纸速.增益.滤波.测量等). ■ 支持MPR.CPR.MIP.SSD ...

  6. redis 5.0.5集群部署与服务器宕机故障模拟

    背景 业务稳定性要求需要一套redis集群来保障 因此采用 redis cluster 集群 环境 名称 ip地址 cpu 内存 master端口 slave端口 redis-651 10.65.6. ...

  7. spring RedisTemplate用法

    1.maven依赖 <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis --&g ...

  8. SpringBoot的使用

    1. Spring Boot概述 目标:了解Spring Boot是什么,有什么作用 小结: Spring Boot是一个便捷搭建 基于spring工程的脚手架:作用是帮助开发人员快速搭建大型的spr ...

  9. 杭电oj Lowest Common Multiple Plus

    Problem Description 求n个数的最小公倍数.   Input 输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数.   Output 为每组测试数据输出它们的最 ...

  10. JDK卸载与JDK12 安装

    JDK卸载与JDK12 安装 一.JDK卸载 控制面板>程序和功能>jdk程序(java 8 update 391:java SE Development Kit8 update 391) ...