1e41f4b71Sopenharmony_ci# NativeBuffer开发指导 (C/C++)
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci## 场景介绍
4e41f4b71Sopenharmony_ci
5e41f4b71Sopenharmony_ciNativeBuffer是提供**共享内存**的模块。开发者可以通过`NativeBuffer`接口实现共享内存的申请、使用、属性查询、释放等操作。
6e41f4b71Sopenharmony_ci针对NativeBuffer,常见的开发场景如下:
7e41f4b71Sopenharmony_ci
8e41f4b71Sopenharmony_ci* 通过`NativeBuffer`提供的Native API接口申请`OH_NativeBuffer`实例,获取内存的属性信息,把对应的ION内存映射到进程空间。
9e41f4b71Sopenharmony_ci
10e41f4b71Sopenharmony_ci## 接口说明
11e41f4b71Sopenharmony_ci
12e41f4b71Sopenharmony_ci| 接口名 | 描述 | 
13e41f4b71Sopenharmony_ci| -------- | -------- |
14e41f4b71Sopenharmony_ci| OH_NativeBuffer_Alloc (const OH_NativeBuffer_Config \*config) | 通过OH_NativeBuffer_Config创建OH_NativeBuffer实例,每次调用都会产生一个新的OH_NativeBuffer实例。 | 
15e41f4b71Sopenharmony_ci| OH_NativeBuffer_Reference (OH_NativeBuffer \*buffer) | 将OH_NativeBuffer对象的引用计数加1。 | 
16e41f4b71Sopenharmony_ci| OH_NativeBuffer_Unreference (OH_NativeBuffer \*buffer) | 将OH_NativeBuffer对象的引用计数减1,当引用计数为0的时候,该NativeBuffer对象会被析构掉。 | 
17e41f4b71Sopenharmony_ci| OH_NativeBuffer_GetConfig (OH_NativeBuffer \*buffer, OH_NativeBuffer_Config \*config) | 用于获取OH_NativeBuffer的属性。 | 
18e41f4b71Sopenharmony_ci| OH_NativeBuffer_Map (OH_NativeBuffer \*buffer, void \*\*virAddr) | 将OH_NativeBuffer对应的ION内存映射到进程空间。 | 
19e41f4b71Sopenharmony_ci| OH_NativeBuffer_Unmap (OH_NativeBuffer \*buffer) | 将OH_NativeBuffer对应的ION内存从进程空间移除。 | 
20e41f4b71Sopenharmony_ci| OH_NativeBuffer_GetSeqNum (OH_NativeBuffer \*buffer) | 获取OH_NativeBuffer的序列号。 | 
21e41f4b71Sopenharmony_ci
22e41f4b71Sopenharmony_ci详细的接口说明请参考[native_buffer](../reference/apis-arkgraphics2d/_o_h___native_buffer.md)。
23e41f4b71Sopenharmony_ci
24e41f4b71Sopenharmony_ci## 开发步骤
25e41f4b71Sopenharmony_ci
26e41f4b71Sopenharmony_ci以下步骤描述了如何使用`NativeBuffer`提供的Native API接口,创建`OH_NativeBuffer`实例获取内存的属性信息,并把对应的ION内存映射到进程空间。
27e41f4b71Sopenharmony_ci
28e41f4b71Sopenharmony_ci**添加动态链接库**
29e41f4b71Sopenharmony_ci
30e41f4b71Sopenharmony_ciCMakeLists.txt中添加以下lib。
31e41f4b71Sopenharmony_ci```txt
32e41f4b71Sopenharmony_cilibnative_buffer.so
33e41f4b71Sopenharmony_ci```
34e41f4b71Sopenharmony_ci
35e41f4b71Sopenharmony_ci**头文件**
36e41f4b71Sopenharmony_ci```c++
37e41f4b71Sopenharmony_ci#include <native_buffer/native_buffer.h>
38e41f4b71Sopenharmony_ci```
39e41f4b71Sopenharmony_ci
40e41f4b71Sopenharmony_ci1. **创建OH_NativeBuffer实例**。
41e41f4b71Sopenharmony_ci    ```c++
42e41f4b71Sopenharmony_ci    #include <iostream>
43e41f4b71Sopenharmony_ci
44e41f4b71Sopenharmony_ci    OH_NativeBuffer_Config config {
45e41f4b71Sopenharmony_ci        .width = 0x100,
46e41f4b71Sopenharmony_ci        .height = 0x100,
47e41f4b71Sopenharmony_ci    };
48e41f4b71Sopenharmony_ci    OH_NativeBuffer* buffer = OH_NativeBuffer_Alloc(&config);
49e41f4b71Sopenharmony_ci    if (buffer == nullptr) {
50e41f4b71Sopenharmony_ci        std::cout << "OH_NativeBuffer_Alloc Failed" << std::endl;
51e41f4b71Sopenharmony_ci    }
52e41f4b71Sopenharmony_ci    ```
53e41f4b71Sopenharmony_ci   
54e41f4b71Sopenharmony_ci2. **将OH_NativeBuffer对应的ION内存映射到进程空间**。
55e41f4b71Sopenharmony_ci    应用如需要访问这块buffer的内存空间,需要通过OH_NativeBuffer_Map接口将buffer对应的ION内存映射到进程空间。
56e41f4b71Sopenharmony_ci    ```c++
57e41f4b71Sopenharmony_ci    // 将ION内存映射到进程空间
58e41f4b71Sopenharmony_ci    void* virAddr = nullptr;
59e41f4b71Sopenharmony_ci    int32_t ret = OH_NativeBuffer_Map(buffer, &virAddr); // 映射后通过第二个参数virAddr返回内存的首地址
60e41f4b71Sopenharmony_ci    if (ret != 0) {
61e41f4b71Sopenharmony_ci        std::cout << "OH_NativeBuffer_Map Failed" << std::endl;
62e41f4b71Sopenharmony_ci    }
63e41f4b71Sopenharmony_ci
64e41f4b71Sopenharmony_ci    // 使用后请及时将OH_NativeBuffer对应的ION内存从进程空间移除
65e41f4b71Sopenharmony_ci    ret = OH_NativeBuffer_Unmap(buffer);
66e41f4b71Sopenharmony_ci    if (ret != 0) {
67e41f4b71Sopenharmony_ci        std::cout << "OH_NativeBuffer_Unmap Failed" << std::endl;
68e41f4b71Sopenharmony_ci    }
69e41f4b71Sopenharmony_ci    ```
70e41f4b71Sopenharmony_ci
71e41f4b71Sopenharmony_ci3. **获取内存的属性信息**。
72e41f4b71Sopenharmony_ci    ```c++
73e41f4b71Sopenharmony_ci    // 获取OH_NativeBuffer的属性
74e41f4b71Sopenharmony_ci    OH_NativeBuffer_Config config2 = {};
75e41f4b71Sopenharmony_ci    OH_NativeBuffer_GetConfig(buffer, &config2);
76e41f4b71Sopenharmony_ci    // 获取OH_NativeBuffer的序列号
77e41f4b71Sopenharmony_ci     uint32_t hwBufferID = OH_NativeBuffer_GetSeqNum(buffer);
78e41f4b71Sopenharmony_ci    ```
79e41f4b71Sopenharmony_ci
80e41f4b71Sopenharmony_ci4. **销毁OH_NativeBuffer**。
81e41f4b71Sopenharmony_ci    ```c++
82e41f4b71Sopenharmony_ci    // 调用OH_NativeBuffer_Unreference引用计数减1,之后buffer的引用计数为0,buffer会销毁
83e41f4b71Sopenharmony_ci    ret = OH_NativeBuffer_Unreference(buffer);
84e41f4b71Sopenharmony_ci    if (ret != 0) {
85e41f4b71Sopenharmony_ci        std::cout << "OH_NativeBuffer_Unreference Failed" << std::endl;
86e41f4b71Sopenharmony_ci    }
87e41f4b71Sopenharmony_ci    ```