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 ```