在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. TCP/IP协议(1): IP 地址和寻址方式 —— IP 协议的基础

    TCP/IP协议(1): IP 地址和寻址方式 -- IP 协议的基础 最近在重学计算机网络,给自己立一个 flag,有感而发的时候写关于 TCP/IP 协议栈的系列博客. IP 地址 IP 地址(I ...

  2. JZOJ 5352. 【NOIP2017提高A组模拟9.7】计数题

    题目 分析 考虑 \(kruskal\) 的过程 我们选边从高位开始 当前位为 \(0\) 的放一边,为 \(1\) 的放另一边 将 \(0\) 的建一棵字典树, \(1\) 的匹配 因为是异或,那就 ...

  3. php pdo如何查询记录条数

    转载php中文网:https://www.php.cn/php-ask-457710.html php pdo查询记录条数的方法:1.使用fetchAll函数查询,其语法如"$rows=$q ...

  4. 跳板攻击之:CS代理转发

    跳板攻击之:CS代理转发 目录 跳板攻击之:CS代理转发 1 环境准备 1.1 环境拓扑 1.2 前提 2 配置 Socks 代理 3 配置转发监听器(正向连接) 4 配置转发上线(反向连接) 1 环 ...

  5. kubernetes client-go功能介绍

    原味地址 https://haiyux.cc/2023/02/26/k8s-client-go/ client-go是什么? client-go是Kubernetes官方提供的Go语言客户端库,用于与 ...

  6. PostgreSQL 谁堵塞了谁(锁等待检测)- pg_blocking_pids

    一.背景 当一个进程处于等待(被堵塞)状态时,是谁干的?可以使用如下函数,快速得到捣蛋(堵塞别人)的PID. 二.案例 1.会话1 postgres=# begin; BEGIN postgres=# ...

  7. P2910 [USACO08OPEN]Clear And Present Danger S题解

    bfac3402-1150-46c7-8798-f545389dbac3 其使用最简单的方法做就好了忘了啥名字,类似于dp 给个代码 #include<bits/stdc++.h> usi ...

  8. Less的相关知识

    1,less中有关 & 符号的使用 渲染结果:(hover的效果也出现)

  9. VMwareSDN环境配置之git安装

    ------------恢复内容开始------------ null ------------恢复内容结束------------

  10. Installing Superset最新版本安装(笔记)

    官方文档:https://superset.apache.org/docs/installation/installing-superset-from-scratch 由于在centos上安装有各种问 ...