android控制台应用binder通讯
在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通讯的更多相关文章
- android灭屏后调用binder通讯竟然影响了socket的POLL_OUT事件,怪事。
当你的android在灭屏(休眠)时分派(dispatch) Ice调用过程中,如果创建了新的进程,你的响应将不会预期那样工作,尽管你已经调用 ice_response或 ice_exception, ...
- Android中的Binder机制的简要理解
转载自:http://www.linuxidc.com/Linux/2012-07/66195.htm http://blog.csdn.net/sunxingzhesunjinbiao/articl ...
- Android深入浅出之Binder机制(转)
Android深入浅出之Binder机制 一 说明 Android系统最常见也是初学者最难搞明白的就是Binder了,很多很多的Service就是通过Binder机制来和客户端通讯交互的.所以搞明白B ...
- 岁末年初3Q大战惊现高潮,360震撼推出Android "3Q" IM即时通讯
岁末年初3Q大战惊现高潮,360震撼推出Android "3Q" IM即时通讯 看过了QQ和360斗争的开端高潮,当然现在还不能说这场斗争已经结束,在我看来这次的事件未尝不是一个适 ...
- 基于Android 平台简易即时通讯的研究与设计[转]
摘要:论文简单介绍Android 平台的特性,主要阐述了基于Android 平台简易即时通讯(IM)的作用和功能以及实现方法.(复杂的通讯如引入视频音频等可以考虑AnyChat SDK~)关键词:An ...
- Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...
- 3Q大战现高潮,360 推出Android "3Q" IM即时通讯,岁末年初3Q大战惊现高潮
岁末年初3Q大战惊现高潮,360震撼推出Android "3Q" IM即时通讯 看过了QQ和360斗争的开端高潮,当然现在还不能说这场斗争已经结束,在我看来这次的事件未 ...
- 从AIDL开始谈Android进程间Binder通信机制
转自: http://tech.cnnetsec.com/585.html 本文首先概述了Android的进程间通信的Binder机制,然后结合一个AIDL的例子,对Binder机制进行了解析. 概述 ...
- [Android进阶]Binder学习(初始篇)
Android中Binder学习(初始篇) 本篇博客学习自侯亮的博客.地址为: 红茶一杯话Binder 1 什么是Binder? 简单地说.Binder是Android平台上的一种跨进程交互技术. 该 ...
- 手把手教Android商业项目-即时通讯-i美聊
[课程概况] 手把手教你从无到有的完整实现一个Android商业项目,是目前整个市场上所没有的课程,废话不多说,请往下看. [项目概况] 项目名称:i美聊 所属领域:移动社交 即时通讯 代码行数: ...
随机推荐
- 【模板】AC自动机(二次加强版)
模板 \(Problem:\) 求 \(n\) 个模式串在文本串中出现的次数 \(templete:\) \(Luogu5357\) \(Code\) #include<cstdio> # ...
- 题解 P4317 花神的数论题
并不难,但是因为各种 SB 原因调了 1145141919810min(悲 我们会发现 \(\operatorname{sum}\) 其实很小,顶多就 \(50\),这启发我们统计每个 \(\oper ...
- mssql 常用sql 语句
----insert ----delete----update----select ----选择数据库进行操作select top 1 * from smzx2018.dbo.tbuseruse sm ...
- 分布式任务调度平台XXL-JOB安装
安装xxl-job-admin 1.拉取镜像 #拉取镜像 docker pull xuxueli/xxl-job-admin:2.3.0 #新建挂载目录 mkdir /usr/local/xxl-jo ...
- label勾选问题,checkbox
<input id="overck_21" data-role="none" name="check" class="reg ...
- chm文档生成->Sandcastle使用帮助
1.介绍 Sandcastle是微软提供的开源的,用于生成.net文档帮助的工具. 源代码路径:https://github.com/EWSoftware/SHFB,进去后能找到Relase版本的路径 ...
- 获取小程序toast控件
Toast 含义 为了给当前视图显示一个浮动的显示块,与dialog不同它永远不会获得焦点 显示时间有限,根据用户设置的显示时间后自动消失 本身是个系统级别的控件,它归属系统settings,当一个a ...
- Echarts 圆形立体柱状图
先放个效果图 const resData = [ { label: "上海", value: 66 }, { label: "北京", value: 26 }, ...
- js实现大转盘抽奖(vue举例)
在开发项目得时候遇到这样一个需求,在移动端项目有个支付抽奖页面,大概效果图如下: 简单介绍一下需求,点击抽奖按钮转盘转动,转盘里边黄色块块是个整张背景图,里边的商品是从接口获取得,包括奖品名称和图片, ...
- 使用svg让页面自适应浏览器大小,整体等比缩放
网页代码: <!DOCTYPE html> <html> <head> <style> body { margin:0; padding:0; widt ...