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