阅读(2241) (7)

鸿蒙OS Ashmem

2022-08-16 15:12:57 更新

Ashmem

java.lang.Object

|---ohos.utils.Ashmem

public class Ashmem
extends Object

提供与匿名共享内存(Ashmem)相关的方法,包括创建、关闭、映射和取消映射Ashmem,从Ashmem读取数据和向Ashmem写入数据,获取Ashmem大小,为Ashmem设置保护。

Ashmem 是由一个进程创建的。 您可以将创建的 Ashmem 对象映射到当前进程以读取和写入数据。 或者,您可以将此 Ashmem 对象传输并映射到另一个进程以进行数据读取和写入。 您需要确保多个进程之间并发读写操作的时序。

字段摘要

修饰符和类型 字段 描述
static int PROT_EXEC 表示可以执行 Ashmem 对象中的数据。
static int PROT_NONE 表示 Ashmem 对象中的数据无法读取、写入或执行。
static int PROT_READ 表示可以读取 Ashmem 对象中的数据。
static int PROT_WRITE 表示可以写入 Ashmem 对象中的数据。

构造函数摘要

构造函数 描述
Ashmem(long nativeObject)

方法总结

修饰符和类型 方法 描述
void closeAshmem() 关闭此 Ashmem。
static Ashmem createAshmem(String name, int size) 根据指定的调试名称和内存大小创建 Ashmem 对象。
static Ashmem createAshmemFromExisting(long unwrappedNativeObject) 通过复制现有的 Ashmem 对象来创建 Ashmem 对象。
protected void finalize() 当垃圾收集确定不再有对该对象的引用时,由对象上的垃圾收集器调用。
long getAshmemIdentity() 获取 Ashmem 对象的身份。
int getAShmemSize() 获取 Ashmem 对象的内存大小。
boolean mapAshmem(int mapType) 使用指定的映射类型将 Ashmem 对象映射到此进程。
boolean mapReadAndWriteAShmem() 在 Ashmem 对象和此进程之间创建读/写映射。
boolean mapReadOnlyAShmem() 在 Ashmem 对象和此进程之间创建只读映射。
byte[] readFromAShmem(int size, int offset) 从 Ashmem 对象中读取数据。
boolean setProtection(int protectionType) 设置 Ashmem 对象的保护类型。
void unmapAShmem() 从此进程中取消映射 Ashmem 对象。
boolean writeToAShmem(byte[] data, int size, int offset) 将数据写入 Ashmem 对象。
从类 java.lang.Object 继承的方法
clone, equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

字段详细信息

PROT_EXEC

public static final int PROT_EXEC

表示可以执行 Ashmem 对象中的数据。

它可用于设置 Ashmem 对象的保护或映射类型。

PROT_NONE

public static final int PROT_NONE

表示 Ashmem 对象中的数据无法读取、写入或执行。

它可用于设置 Ashmem 对象的保护或映射类型。

PROT_READ

public static final int PROT_READ

表示可以读取 Ashmem 对象中的数据。

它可用于设置 Ashmem 对象的保护或映射类型。

PROT_WRITE

public static final int PROT_WRITE

表示可以写入 Ashmem 对象中的数据。

它可用于设置 Ashmem 对象的保护或映射类型。

构造函数详细信息

Ashmem

public Ashmem(long nativeObject)

方法详情

createAshmem

public static Ashmem createAshmem(String name, int size)

根据指定的调试名称和内存大小创建 Ashmem 对象。

调试名称仅用于在检查已映射到此 Ashmem 的进程的内存映射时查询有关此 Ashmem 的信息。

参数:

参数名称 参数描述
name 调试名称,方便查询Ashmem信息。
size 指示 Ashmem 的大小。

返回:

返回创建的 Ashmem 对象; 如果创建失败则返回 null。

createAshmemFromExisting

public static Ashmem createAshmemFromExisting(long unwrappedNativeObject)

通过复制现有的 Ashmem 对象来创建 Ashmem 对象。

两个 Ashmem 对象指向同一个共享内存区域。

参数:

参数名称 参数描述
unwrappedNativeObject 表示现有 Ashmem 对象的 ID。 您可以使用 getAshmemIdentity() 方法获取 ID。

返回:

返回创建的 Ashmem 对象。

finalize

protected void finalize() throws Throwable

从类复制的描述:对象

当垃圾收集确定不再有对该对象的引用时,由对象上的垃圾收集器调用。子类覆盖 finalize 方法以释放系统资源或执行其他清理。

finalize 的一般约定是,当 Java™ 虚拟机确定不再有任何方法可以让任何尚未终止的线程访问该对象时调用它,除非是由于某个操作而导致的。由准备完成的其他对象或类的完成所采取。 finalize 方法可以采取任何行动,包括使该对象再次可供其他线程使用;然而,finalize 的通常目的是在对象被不可撤销地丢弃之前执行清理操作。例如,代表输入/输出连接的对象的 finalize 方法可能会执行显式 I/O 事务以在对象被永久丢弃之前中断连接。

Object 类的 finalize 方法不执行任何特殊操作;它只是正常返回。 Object 的子类可以覆盖这个定义。

Java 编程语言不保证哪个线程将为任何给定对象调用 finalize 方法。但是,可以保证调用 finalize 的线程在调用 finalize 时不会持有任何用户可见的同步锁。如果 finalize 方法抛出未捕获的异常,则忽略该异常并终止该对象的终结。

在为一个对象调用 finalize 方法后,不会采取进一步的行动,直到 Java 虚拟机再次确定没有任何方法可以让任何尚未终止的线程访问该对象,包括可能的行动由其他准备完成的对象或类,此时该对象可能被丢弃。

对于任何给定的对象,Java 虚拟机永远不会多次调用 finalize 方法。

finalize 方法抛出的任何异常都会导致该对象的终结被暂停,否则会被忽略。

覆盖:

在类 Object 中完成

Throws:

Throw名称 Throw描述
Throwable 此方法引发的异常

closeAshmem

public void closeAshmem()

关闭此 Ashmem。

通过createAshmem(java.lang.String,int)创建的Ashmem对象不再需要时,必须调用该方法及时关闭,防止内存泄漏。

mapAshmem

public boolean mapAshmem(int mapType)

使用指定的映射类型将 Ashmem 对象映射到此进程。

在使用 Ashmem 读写数据之前,必须调用该方法将 Ashmem 对象映射到该进程上。 映射大小是Ashmem对象的总内存大小,映射从Ashmem的起始位置开始。 映射类型必须包含在为此 Ashmem 对象设置的保护类型中。

参数:

参数名称 参数描述
mapType 指示要使用的映射类型。 该值是 PROT_READ(可读/不可读)、PROT_WRITE(可写/不可写)、PROT_EXEC(可执行/不可执行)或 PROT_NONE 的按位或组合。

返回:

如果映射成功,则返回 true; 否则返回 false。

mapReadAndWriteAShmem

public boolean mapReadAndWriteAShmem()

在 Ashmem 对象和此进程之间创建读/写映射。

映射大小是Ashmem对象的总内存大小,映射从Ashmem的起始位置开始。 调用该方法时,确保Ashmem对象的保护类型包括PROT_READ | PROT_WRITE。

返回:

如果映射成功,则返回 true; 否则返回 false。

mapReadOnlyAShmem

public boolean mapReadOnlyAShmem()

在 Ashmem 对象和此进程之间创建只读映射。

映射大小是Ashmem对象的总内存大小,映射从Ashmem的起始位置开始。 调用此方法时,请确保 Ashmem 对象的保护类型包括 PROT_READ。

返回:

如果映射成功,则返回 true; 否则返回 false。

unmapAShmem

public void unmapAShmem()

从此进程中取消映射 Ashmem 对象。

在您使用完通过 mapAshmem(int)、mapReadAndWriteAshmem 或 mapReadOnlyAshmem 映射到您的进程的 Ashmem 后,您必须调用此方法取消映射以防止内存泄漏。 如果需要,您可以再次创建映射。

setProtection

public boolean setProtection(int protectionType)

设置 Ashmem 对象的保护类型。

保护类型只能添加,不能删除。

一旦设置了保护类型,它将对所有到 Ashmem 对象的映射生效,无论这些映射是在设置保护类型之前还是之后创建的。

参数:

参数名称 参数描述
protectionType 指示要设置的保护类型。 该值是 PROT_READ、PROT_WRITE、PROT_EXEC 或 PROT_NONE 的按位或运算组合。

返回:

设置成功返回true; 否则返回 false。

getAShmemSize

public int getAShmemSize()

获取 Ashmem 对象的内存大小。

返回:

返回 Ashmem 对象的内存大小。

writeToAShmem

public boolean writeToAShmem(byte[] data, int size, int offset)

将数据写入 Ashmem 对象。

您需要控制多进程操作的时序。

在调用该方法之前,请确保您已经获得了Ashmem对象的写权限,并且已经为您的进程创建了到该Ashmem对象的写映射。

参数:

参数名称 参数描述
data 表示要写入 Ashmem 对象的数据。
size 指示要写入的数据的大小。
offset 指示在 Ashmem 对象中写入数据的起始位置。

返回:

如果数据写入成功,则返回 true; 其他场景返回 false,如数据写入越界或未获得写入权限。

readFromAShmem

public byte[] readFromAShmem(int size, int offset)

从 Ashmem 对象中读取数据。

您需要控制多进程操作的时序。

在调用此方法之前,请确保您已获得 Ashmem 对象的读取权限,并且已为您的进程创建了到此 Ashmem 对象的读取映射。

参数:

参数名称 参数描述
size 指示要读取的数据的大小。
offset 指示 Ashmem 对象中读取数据的起始位置。

返回:

返回读取的数据。

getAshmemIdentity

public long getAshmemIdentity()

获取 Ashmem 对象的身份。

返回:

返回 Ashmem 对象的标识。