Ashmem、MemoryFile、Binder的共享内存(jni可用)
最近,我决定开始自己的硬件旅程。最重要的部分是选择正确的操作系统。我试图使用多个嵌入式Linux系统,但有许多便携式和开发问题。另外最近的Android平台更新让我更有信心,所以我打赌它,并了解更多!
这篇文章打算分享一些关于IPC相关的Android平台开发,而不是普通的Android应用程序,尽管许多概念可以适应这一点。
有一个有趣的幻灯片为Android绑定库Deep Dive Into Binder,包括许多有用的链接。并且gburca / BinderDemo提供了非常简单的绑定演示。这里我将展示一些使用ashmem库的示例代码,当然我们需要绑定机制。
我已经在GitHub https://github.com/vecio/AndroidIPC发布了这篇文章中使用的代码,一旦获得root权限,它可以在真正的Android设备上运行。
ashmem
Linux具有资源昂贵的共享内存实现shm,但是Android设计用于资源有限的嵌入式硬件,因此他们制作了自己的ashmem,它们生活在$ AOSP / system / core之下。
处理通用的Linux文件描述符后,ashmem背后的魔法非常简单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);
它被称为共享内存,因为从ashmem创建的区域可以在不同进程之间使用。但是创建的内存指针mmap
是与进程相关的,文件描述符也是如此ashmem_create_region
,即它们只在与其创建的相同进程中有效。
所以,我们需要一些机制来共享这个区域指针到其他进程。
MemoryFile
虽然在Dalvik VM上运行的Android应用程序,他们需要从ashmem库中受益,所以MemoryFile.java被创建为ashmem C库中的一个薄包装。
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;}
}
MemoryFile的详细实现可以在$ AOSP / frameworks / base / core / jni / android \ os_MemoryFile.cpp_找到。
活页夹
为了在两个过程之间建立桥梁,我们可以使用Binder。Binder是Android IPC系统的核心,它定义了一些编写IPC代码的基本界面,就像熟悉的AIDL工具一样。的确,AIDL是Binder的包装。
要定义界面,只需实现IInterface
:
class ISHM : public IInterface {public:virtual status_t setFD(uint32_t fd) = 0;DECLARE_META_INTERFACE(SHM);
};
定义接口后,客户端和服务端都应该实现接口:
// 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;}}
};
分享内存
从上面的代码,有两个重要的功能writeFileDescriptor
和readFileDescriptor
。是的,他们是将Linux文件描述符从一个进程转移到另一个进程的魔法。
我们如何从MemoryFile
对象获取文件描述符?
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);
}
完整的项目已在GitHub https://github.com/vecio/AndroidIPC上发布。
Ashmem、MemoryFile、Binder的共享内存(jni可用)相关推荐
- android 进程间的通信,Android native进程间通信实例-binder结合共享内存
在android源码的驱动目录下,一般会有共享内存的相关实现源码,目录是:kerneldriversstagingandroidashmem.c.但是本篇文章不是讲解android共享内存的功能实现原 ...
- Android系统匿名共享内存Ashmem(Anonymous Shared Memory)驱动程序源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6664554 在上一文章Android系统匿名共 ...
- Anonymous Shared Memory android 匿名共享内存
原址 两个特点: 能够辅助内存管理系统来有效的管理不再使用的内存块 通过Binder进程间通信机制来实现进程间的内存共享. Android系统的匿名共享内存子系统的主体是以驱动程序的形式实现在内核空间 ...
- Android Binder 分析——匿名共享内存(Ashmem)
前面分析了 binder 中用来打包.传递数据的 Parcel,一般用来传递 IPC 中的小型参数和返回值.binder 目前每个进程 mmap 接收数据的内存是 1M,所以就算你不考虑效率问题用 P ...
- Android系统匿名共享内存Ashmem(Anonymous Shared Memory)简要介绍和学习计划
在Android系统中,提供了独特的匿名共享内存子系统Ashmem(Anonymous Shared Memory),它以驱动程序的形式实现在内核空间中.它有两个特点,一是能够辅助内存管理系统来有效地 ...
- Android Binder 分析——匿名共享内存(好文)
原址 文章目录 1. 原理概述 2. java 层接口 3. native 层接口 4. kernel 驱动 5. 例子 前面分析了 binder 中用来打包.传递数据的 Parcel,一般用来传递 ...
- Android系统的Ashmem匿名共享内存子系统分析(4)- Ashmem子系统的 Java访问接口
声明 其实对于Android系统的Ashmem匿名共享内存系统早就有分析的想法,记得2019年6.7月份Mr.Deng离职期间约定一起对其进行研究的,但因为我个人问题没能实施这个计划,留下些许遗憾- ...
- Android系统匿名共享内存Ashmem(Anonymous Shared Memory)在进程间共享的原理分析
在前面一篇文章Android系统匿名共享内存Ashmem(Anonymous Shared Memory)驱动程序源代码分析中,我们系统地介绍了Android系统匿名共享内存的实现原理,其中着重介绍了 ...
- 安卓ashmem(匿名共享内存映射)学习native篇
转自:http://blog.csdn.net/u010657219/article/details/41248965 先看看之前三个进程的关系: 由于这里用到了Binder进程间通信机制,这里再次贴 ...
最新文章
- MindSpore布道师队伍招募开始,助力小白成为大牛!
- [html] iframe可以使用父页面中的资源吗(如:css、js等)?
- mysql做乘法运算溢出_乘法溢出及对策
- 信息学奥赛一本通(1235:输出前k大的数)——堆排序
- php 筛选搜索,筛选——搜索
- 何小鹏:从工程师思维到用户思维,这是互联网造车将带来的变革
- HTML页面跳转的5种方法。
- 根据 轮播图背景色 自动填充剩余背景色的 走马灯
- 计算机专业英语unit11,计算机专业英语教程
- 串口调试常见问题和排查方法
- foxmail远程主机强迫关闭了一个现有的连接
- 通过三层交换机实现vlan间互通
- 安徽大学计算机科学与技术学院klu,方贤勇 - 安徽大学 - 计算机科学与技术学院...
- 集成学习 hard/soft Voting,Bagging/Pasting,oob 随机森林
- c# Thumbnail 生成缩略图,生成压缩图,最大宽高比例缩放,最大边按比例缩放
- ADRC,自抗扰控制器,扩张状态观测器,ESO,模型预测控制算法MPC
- 一本通1592【例 1】国王
- 第七周 任务一
- Android - 一些Kotlin写法
- SU+GIS,让SketchUp模型在地图上活起来
热门文章
- 论一种迫不得已用全中文数据库的情景
- linux下i2c驱动笔记
- 巧解汽车冬季病 启动无力别“轰油”热车
- 如何快速获知需要的SPS Sql Search语法
- Java解析中文数字字符串
- acm java题_【转】ACM中java的使用
- NLP --- 条件随机场CRF背景
- java 复制一个对象_Java如何完全复制一个对象
- 上有程序员删库跑路,这次是程序员锁死服务器,600万打水漂,创始人负债数百万!
- 华为nova3e怎么分屏_华为手机怎么分屏?边看视频边聊微信!不是所有手机都能做到...