SharedMemory使用,跨进程传输byte数据

背景

工作中碰到一个需求,需要跨进程传输图片,项目中使用了android的SharedMemory,这里简单介绍下它的使用。

添加此功能的API

API level 27

类接口

参见官方文档
https://developer.android.google.cn/reference/android/os/SharedMemory?hl=en

跨进程使用(这里以传图片字节为例)

一、服务端创建并存入数据:

    // 1、使用文件流把文件读入到内存
    FileInputStream inputStream = new FileInputStream(jpegFile);
    byte[] bytes = new byte[(int) jpegFile.length()];
    inputStream.read(bytes);

    // 2、创建sharedMemory跨进程传输
    SharedMemory sharedMemory = SharedMemory.create("test", bytes.length);
    // 3、mapReadWrite获取ByteBuffer
    ByteBuffer buffer = sharedMemory.mapReadWrite();
    // 4、put数据
    buffer.put(bytes);
    // 5、把sharedMemory权限设置为只读,create默认是读写权限都有,这里可以避免客户端更改数据
    sharedMemory.setProtect(OsConstants.PROT_READ);
    // 6、使用完需要unmap
    SharedMemory.unmap(buffer);
    return sharedMemory;

二、客户端获取数据显示

    // 1、通过aidl拿到SharedMemory
    SharedMemory sharedMemory = iService.takeScreenshot();
    if (sharedMemory == null) {
        return;
    }
    // 2、mapReadOnly获取到存了数据的ByteBuffer
    ByteBuffer byteBuffer = sharedMemory.mapReadOnly();
    int len = byteBuffer.limit() - byteBuffer.position();
    byte[] bytes = new byte[len];
    // 3、借助byteBuffer获取到数据
    byteBuffer.get(bytes);
    // 4、把字节转换成bitmap并显示到imageView
    Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
    imageView.setVisibility(View.VISIBLE);
    imageView.setImageBitmap(bitmap);
    // 5、使用完unmap同时close sharedMemory释放内存
    SharedMemory.unmap(byteBuffer);
    sharedMemory.close();

注意事项

1、服务端service销毁时,记得sharedMemory.close
2、服务端传输sharedMemory时,记得setProtect(OsConstants.PROT_READ)
3、客户端使用完sharedMemory,最好unmap下,避免内存占用

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: C语言中的sharememory(共享内存)是一种在多个进程之间共享内存数据的机制。通过一定的方法,不同进程可以访问和共享同一片物理内存区域,实现了不同进程之间快速,高效的数据共享。 一个进程将某些内存空间标记为共享,另一个进程通过操作系统的共享内存函数获得对该内存区域的访问权限,进而实现数据的共享。共享内存相较于其他通信机制来说具有快速、高效的优点,因为不需要数据复制和进程切换等操作,数据读取和写入的速度更快,尤其是面对大规模的数据计算和并发问题时,共享内存的表现更加突出。 共享内存也存在一些缺点,主要是由于不同进程可以直接访问同一片内存,因此存在数据一致性和互斥性等问题,需要使用锁和同步机制来避免数据错误和互相影响的问题。共享内存通常应用于高并发场景,如高性能计算、数据库、进程监控和实时系统等。 总之,共享内存是C语言进行多进程数据共享的重要机制,它提高了数据访问和交互的效率和精准度,也为进程之间相互依赖、协作提供了强有力的支持和保障。 ### 回答2: 共享内存是一种通信方式,它允许不同进程之间共享同一块物理内存空间。采用共享内存进行进程间通信,可以提高程序的运行速度和效率,同时也可以减少进程间通信的复杂度。 在共享内存机制中,多个进程可以同时访问同一块内存区域的数据,而不需要进行数据的复制或传输。这种方法可以避免数据在不同进程之间交换时产生的开销和延迟,从而更快地完成数据共享和协作。 共享内存的实现通常依赖于操作系统提供的特殊机制和标准库。在C语言中,可以使用函数库中的相关API来实现不同进程之间的共享内存交互。例如,在Linux操作系统中,可以使用fork()函数创建新进程,在父/子进程之间共享内存数据,并使用semaphore信号量来进行同步访问。 总的来说,共享内存提供了一种高效、简单和灵活的进程间通信方式。它能够满足不同程序之间的数据交换和协作需求,从而提高程序的性能和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值