[转]android jni层binder使用/进程通信实例

Android 进阶——Framework核心 之Binder Java成员类详解(三) Framework核心 之Binder Java成员类详解 阅读详情

Recently, I’ve decided to begin my own hardware journey. The most important part is to choose a proper operating system. I’ve tried to use several embedded Linux systems, but got many portable and development issues. Also the recent Android platform updates make me more confident on it, so I bet it and learn more about it!

This post intends to share something about IPC related to Android platform development, not for common Android apps, though many concepts can adapt to that.

There is an interesting slides for Android binder library Deep Dive Into Binder, with many useful links included. And a very simple binder demo was provided by gburca/BinderDemo. Here I will show some sample code to use ashmem library, of course, we need the binder mechanism.

I’ve published the code used in this post at GitHub https://github.com/vecio/AndroidIPC, which can run on real Android device once you have root permission.

ashmem

Linux has a resource expensive shared memory implementation shm, but Android is designed to be used for resource limited embedded hardware, so they crafted their own ashmem, which lives under $AOSP/system/core.

The magic behind ashmem is quite simple as handling generic Linux file descriptor and mmap.

int fd = ashmem_create_region(name, size);
ashmem_pin_region(fd, 0, 0);
uint8_t *shm = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, image->fd, 0);

It’s called shared memory because the region created from ashmem could be used between different processes. But the memory pointer created by mmap is process dependent, and so is the file descriptor from ashmem_create_region, i.e. they are only valid in the same process they are created.

So, we need some mechanism to share this region pointer to other processes.

MemoryFile

While Android apps running on Dalvik VM, they need to benefit from the ashmem library, so MemoryFile.java is created as a thin wrapper upon ashmem C library.

public MemoryFile(String name, int length) throws IOException {
    mLength = length;
    mFD = native_open(name, length);
    if (length > 0) {
        mAddress = native_mmap(mFD, length, PROT_READ | PROT_WRITE);
    } else {
        mAddress = 0;
    }
}

The detailed implementation of MemoryFile could be found at $AOSP/frameworks/base/core/jni/android\os_MemoryFile.cpp_.

Binder

To make the bridge between two processes, we may use Binder. Binder is the core of Android IPC system, it defines some basic interfaces to write IPC code, just like the familiar AIDL tools. Indeed, AIDL is an wrapper of Binder.

To define the interface, just implement the IInterface:

class ISHM : public IInterface {
  public:
    virtual status_t setFD(uint32_t fd) = 0;

    DECLARE_META_INTERFACE(SHM);
};
After the interface defined, the client and service side should both implement the interface:

// The client side
class BpSHM : public BpInterface<ISHM> {
  public:
    BpSHM(const sp<IBinder>& impl) : BpInterface<ISHM>(impl) {
      ALOGD("BpSHM::BpSHM()");
    }

    virtual status_t setFD(uint32_t fd)
    {
      ALOGD("BpSHM::setFD(%u)", fd);
      Parcel data, reply;
      data.writeInterfaceToken(ISHM::getInterfaceDescriptor());
      data.writeFileDescriptor(fd);
      remote()->transact(SET_FD, data, &reply);
      return reply.readInt32();
    }
};

IMPLEMENT_META_INTERFACE(SHM, "io.vec.IPC");


// The server side
class BnSHM : public BnInterface<ISHM> {
  virtual status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0)
  {
    ALOGD("BnSHM::onTransact(%u)", code);
    CHECK_INTERFACE(ISHM, data, reply);
    switch(code) {
      case SET_FD: {
             reply->writeInt32(setFD(data.readFileDescriptor()));
             return NO_ERROR;
           } break;
      default: {
             return BBinder::onTransact(code, data, reply, flags);
           } break;
    }
  }
};

Share the memory

From the code in above section, there are two important functions writeFileDescriptor and readFileDescriptor. Yes, they are the magics to transfer a Linux file descriptor from one process to another.

How do we get the file descriptor from MemoryFile object?

static jboolean jni_setMemoryFile(JNIEnv* env, jclass clz, jobject jmf)
{
  jclass clsMF = env->FindClass("android/os/MemoryFile");
  jfieldID fldFD = env->GetFieldID(clsMF, "mFD", "Ljava/io/FileDescriptor;");
  jobject objFD = env->GetObjectField(jmf, fldFD);
  jclass clsFD = env->FindClass("java/io/FileDescriptor");
  fldFD = env->GetFieldID(clsFD, "descriptor", "I");
  jint fd = env->GetIntField(objFD, fldFD);
  env->DeleteLocalRef(clsFD);
  env->DeleteLocalRef(objFD);
  env->DeleteLocalRef(clsMF);
  ALOGD("jni_setMemoryFile(%d)", fd);
  sp<ISHM> service = SHM::getService();
  return (service->setFD(fd) == NO_ERROR);
}

The full project has been published at GitHub https://github.com/vecio/AndroidIPC.

图解Android中的binder机制 一个进程是不能直接直接操作另一个进程的,比如说读取另一个进程的数据,或者往另一个进程的内存空间写数据,进程之间的通信要通过内核进程才可以,因此这里就要使用到进程通信工具Binder了如下图:Binder driver通过/dev/binder /dev/binder 提供了 open, release release, poll poll, mmap mmap, flush flush, and ioctl等操作的接口api。这样进程A和进程B就可以通过内核进程进行通信了。 阅读详情

相关推荐

Android基础之Binder分析(2)

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2019-2021BAT 面试真题解析,我把大厂面试中常被问到的技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。还有 高级架构技术进阶脑图 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。Android 基础知识点Java 基础知识点Android 源码相关分析常见的一些原理性问题。

2401_84010497的博客 1109

Binder ——binder的jni注册和binder驱动

Binder的jni注册和binder驱动

l18320786461的博客 925

Android Binder 进程间通信

Linux 中的系统内存可以分为两个不同的区域:内核空间和用户空间。内核空间是内核(即操作系统的核心)执行(即运行)并提供其服务的地方。内存由 RAM(随机存取存储器)单元组成,其内容可以以极高的速度访问(即读取和写入),但只能临时保留(即,在使用时或最多在电源保持开启时保留)。它的目的是保存当前正在使用的程序和数据,从而充当 CPU(中央处理器)和速度慢得多的存储之间的高速中介,后者通常由一个或多个硬盘驱动器 (HDD) 组成。用户空间是用户进程(即内核以外的所有内容)运行的内存位置的集合。

LiuYong_01的博客 1972

android 系统核心机制binder(10)binder java层JNI初始化

系列文章解读&说明: Android系统核心机制binder的分析主要分为以下部分: android 系统核心机制binder(01)C语言简谈binder android 系统核心机制binder(02)binder驱动层原理 android 系统核心机制binder(03)binder C++层实现 android 系统核心机制binder(04)binder C++层 Te...

wangdsh的博客 1216

Android Binder通信底层超详细讲解

前言 复习、复习、复习 你是否了解Binder机制? Binder这么好用,那为什么Zygote的IPC通信机制用Socket而不用Binder? 为什么说Binder是安全的? Intent跨进程传大图为什么会崩溃? AIDL的oneWay和非oneway有什么区别? 本文将针对以上问题进行原理分析 目录 一、IPC机制 Inter-Process Communication 简称 IPC ,即为进程间通信。Android与Liunx都有自己的IPC机制。虽然说Android是继承自Linux的,但是I

hpc_kiven的博客 2379

Android Binder——JNI层介绍(四)

JNI(Java Native Interface)是 Java 平台提供的一种机制,允许 Java 代码与本地应用程序(如C/C++)进行交互。在 Android 中,JNI 层主要用于实现 Java 层与底层 C/C++ 代码之间的通信。通过 JNI,Android 系统可以将一些性能要求较高的功能(如图像处理、音频处理等)用 C/C++ 实现,以提高系统的运行效率。本地方法实现:Java 层通过 JNI 调用底层 C/C++ 代码实现的方法。这些方法可能涉及到底层硬件操作、性能优化等。数据转换。

小旭的专栏 1223

Android基础——JNI机制

通过使用jni实现java和C/C++的互相调用

weixin_44901971的博客 1069

Android NDK实现Binder服务和客户端

需要在系统源码下编译,或者提取出对应的头文件亦可。这里需要注意Android4.x以后系统SeLinux如果打开,系统级需要配置对应的sepolicy才能使用。测试阶段推荐直接setenforce 0关闭鉴权即可

Android Binder框架实现之Java层Binder整体框架设计

 Android Binder框架实现之Framework层Binder整体框架设计 前言   本文是Android Binder框架实现之Framework层Binder整体框架设计的起始篇,本文会重点讲述Android Binder框架Framework层整体设计思路,本系列的文章列表如下: Android Binder框架实现之Binder的设计和框架 Android Binder框架实现之Binder中的数据结构 Android Binder框架实现之Binder相关的接口和类 Android

IT先森 2897

一文详细讲解CRM系统(附架构图、流程、功能介绍)

专为中小企业量身打造高性价比的数字化转型路径!企业如何用CRM才能真正做到降本增效?今天,就用一文讲清这些问题!读完本文,你将清楚得了解CRM的概念、框架、流程、功能、企业成功案例,文末还有常见问题解答。

Dabeishandong的博客 9930

半导体设备上位机开发:我的经验与新人指导

半导体设备上位机开发是一项复杂而富有挑战性的工作,需要扎实的技术基础和丰富的经验。如果你对半导体设备上位机开发感兴趣,欢迎随时与我交流,我会尽力帮助你!

qq_43518667的博客 2731

Android基础之Binder分析

我见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了5、6年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。不断奔跑,你就知道学习的意义所在!

2401_84537603的博客 1322

FPGA时钟设计陷阱:为什么你的MRCC引脚总触发Place 30-675错误?

本文深入解析FPGA开发中常见的Place 30-675错误,揭示MRCC引脚与时钟资源分配的关键问题。通过对比MRCC与普通IO引脚特性,分析错误根源,并提供时钟约束优化、IP核重配置和手动布局三套解决方案,帮助工程师规避时钟设计陷阱,提升FPGA系统稳定性。

potato的博客 693

Android Java层和Native层通信实战大荟萃之JNI实现通信

        Android和C/C++通过Jni实现通信   在前面篇章Android和C/C++通过原生socket实现通信和Android和C/C++通过LocalSocket实现通信分别介绍了通过原生socket和LocalSocket实现Android和C/C++的通信方式,前面两种方式都可以实现跨进程通信,那么今天我们要介绍的就是在Android同一个进程里面通过Jni实现Java世...

IT先森 2754

Spring Boot 微服务 API 网关实战:Spring Cloud Gateway 整合,搞定路由转发 + 统一认证 + 限流熔断(企业级落地)

摘要:本文详细介绍了SpringCloud Gateway在微服务架构中的核心作用与实现方案。作为API网关,它解决了服务入口分散、认证冗余、流量失控等痛点,提供路由转发、统一认证、限流熔断等能力。文章通过图书管理系统案例,演示了SpringBoot整合Gateway的全流程,包括基础路由配置、JWT全局认证、局部参数校验、Sentinel限流熔断以及Nacos动态路由等核心功能实现。特别强调了企业级落地中的关键注意事项,如路由顺序、过滤器执行顺序、HTTPS配置等。该方案能有效构建统一、安全、高效的微服务

lamehsl的专栏 1381

高级数据库--作业及答案

中科大金培权老师的高级数据库课程作业及答案

一杯水果茶!足矣~ 1658

Binder原理:

addService函数将数据打包发送给BpBinder来进行处理。BpBinder新建一个 IPCThreadState对象,并将通信的任务交给 IPCThreadState。IPCThreadState的 writeTransactionData函数用于将命令协议和数据写入mOut。IPCThreadState的waitForResponse函数主要有两个作用,一个作用是通过ioctl函数操作,mOut和mIn与Binder驱动进行数据交互,另一个作用是处理各种命令协议。

weixin_74399377的博客 1834

让 ABAP Screen Variant 安稳上车:SHD0 与 SHD0_MANDT 的 Transport 全攻略

摘要: SAP项目常需优化交易码界面,通过SHD0的Transaction Variant和Screen Variant可实现字段精简、默认值预设及权限控制,避免修改标准代码。但跨系统迁移时易出现变式丢失或版本兼容问题。核心概念包括: Screen Variant:针对单个屏幕的字段属性配置(跨Client); Transaction Variant:串联多屏幕变式(分跨Client和Client-specific); 版本差异:4.70/6.x后需区分SHD0(跨Client)与SHD0_MANDT(Cl

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 226

Android Binder【篇三:透视 Framework Java 通信机制】

Binder是Android系统提供的一种IPC( 进程间通信) 机制,在Java层中如果想要利用Binder进行跨进程的通信, 也得定义一个类似ITest的接口,不过这是一个aidl文件。阿斗(aidl的谐音) 本来是扶不起的, 可是我们有了AIDL工具,就有可能将他扶起!即AIDL是Binder系统面向Java层的一种实现机制。 参考:Android中AIDL的使用详解 一、AIDL简单演示 AIDL是Android中IPC(Inter-Process Communication)方式中的一...

qq_27672101的博客 2752

指纹浏览器降维打击(下):Cloudflare Turnstile 与 hCaptcha 的底层交互逻辑

本文将深度拆解:Turnstile 与 hCaptcha 的 Iframe 沙箱通信机制,动态混淆 JS 与 PoW(工作量证明)的物理破解法则,以及如何通过 C++ 底层事件合成与环境基因强绑定,实现验证码的“无感过验”。

数据知道的博客 422

RuyiDify如何创建知识库API密钥:让程序安全访问知识库

知识库 API Key 是程序访问知识库的钥匙。创建它很简单,但真正重要的是知道它能做什么、应该放在哪里、不能暴露给谁。RuyiDify 讲这一步,不是为了让大家多记一个按钮,而是为了把知识库从“人工上传资料”推进到“程序化维护资料”。

未来已来,AI时代,学AI编程,做AI量化,就来大鹏AI教育。 136

Android的Binder机制

Android中Activity,Service等组件需要和AMS通信,这种跨进程通信都是通过Binder完成的。

m0_56144365的博客 1344

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Android Binder

Binder是Android系统中进程间通讯(IPC)的一种方式,也是Android系统中最重要的特性之一。Android中的四大组件Activity,Service,Broadcast,ContentProvider,不同的App等都运行在不同的进程中,它是这些进程间通讯的桥梁。 1. Binder通信机制 1.1 一些思考 用户空间/内核空间: Ke...

kimi985566的博客 1894

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Android基础之Binder分析(2),1个月学会Android开发

针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!Android前沿技术大纲全套体系化高级架构视频Android高级架构资料、源码、笔记、视频。

2401_84149381的博客 1197

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Andriod——IPC进程通信JAVA层工作原理简析

众所周知,Android每个APP都运行在各自的Dalvik虚拟机里面,每个虚拟机都等同于Linux的进程,这样做的原因是为了隔离进程,保证各个不同APP的安全,比如其中一个APP挂了不会影响到其他的正在运行的APP。而这样做APP各自的进程不能够直接进行通信。所以需要借助于Binder机制(当然还有socket和Linux原始的内存共享机制实现进程通信,不过都比较麻烦)。所以在这片文章主要结合自己

a591193965的博客 1697

Android中Binder学习

关于Binder,我们需要知道,为什么需要跨进程通信(IPC),怎么做到跨进程通信?为什么是Binder? 由于Android是基于Linux内核的,因此有些知识需要我们先了解: 进程隔离 进程隔离是为保护操作系统中进程互不干犹而设计的一组不同硬件和软件的技术。这个技术是为了避免进程A写入进程B的情况发生。进程的隔离实现,使用了虚拟地址空间。进程A的虚拟地址和进程B的虚拟地址不同,这样就放置进程A...

小薇子的博客 5888
上一篇: mac修改提示符之执行成功就显示白色笑脸
下一篇: osx使用cmake编译opencv错误记录
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值