1# Using Image_NativeModule to Receive Images 2 3You can use the **ImageReceiver** class to obtain the surface ID of a component, read the latest image or the next image, and release **ImageReceiver** instances. 4 5## How to Develop 6 7### Adding Dependencies 8 9Open the **src/main/cpp/CMakeLists.txt** file of the native project, add **libohimage.so**, **libimage_receiver.so**, **libnative_image.so**, and **libhilog_ndk.z.so** (on which the log APIs depend) to the **target_link_libraries** dependency. 10 11```txt 12target_link_libraries(entry PUBLIC libhilog_ndk.z.so libohimage.so libimage_receiver.so libnative_image.so) 13``` 14 15### Calling the Native APIs 16 17For details about the APIs, see [Image_NativeModule](../../reference/apis-image-kit/_image___native_module.md). 18 19Implement the C native APIs in **hello.cpp**. Refer to the sample code below. 20 21```c++ 22#include <hilog/log.h> 23#include <multimedia/image_framework/image/image_native.h> 24#include <multimedia/image_framework/image/image_receiver_native.h> 25 26#undef LOG_DOMAIN 27#define LOG_DOMAIN 0x3200 28 29#undef LOG_TAG 30#define LOG_TAG "MY_TAG" 31 32#define IMAGE_WIDTH 320 33#define IMAGE_HEIGHT 480 34#define IMAGE_CAPACITY 2 35 36static void OnCallback(OH_ImageReceiverNative *receiver) 37{ 38 OH_LOG_INFO(LOG_APP, "ImageReceiverNativeCTest buffer avaliable."); 39} 40 41static void ImageReceiverNativeCTest() 42{ 43 // Create an OH_ImageReceiverOptions instance. 44 OH_ImageReceiverOptions* options = nullptr; 45 Image_ErrorCode errCode = OH_ImageReceiverOptions_Create(&options); 46 if (errCode != IMAGE_SUCCESS) { 47 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest create image receiver options failed, errCode: %{public}d.", errCode); 48 return; 49 } 50 51 Image_Size imgSize; 52 imgSize.width = IMAGE_WIDTH; 53 imgSize.height = IMAGE_HEIGHT; 54 55 // Set the size attribute of OH_ImageReceiverOptions. 56 errCode = OH_ImageReceiverOptions_SetSize(options, imgSize); 57 if (errCode != IMAGE_SUCCESS) { 58 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest set image receiver options size failed, errCode: %{public}d.", errCode); 59 OH_ImageReceiverOptions_Release(options); 60 return; 61 } 62 63 // Set the capacity attribute of OH_ImageReceiverOptions. 64 errCode = OH_ImageReceiverOptions_SetCapacity(options, IMAGE_CAPACITY); 65 if (errCode != IMAGE_SUCCESS) { 66 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest set image receiver options capacity failed, errCode: %{public}d.", errCode); 67 OH_ImageReceiverOptions_Release(options); 68 return; 69 } 70 71 // Read the size attribute of OH_ImageReceiverOptions. 72 Image_Size imgSizeRead; 73 errCode = OH_ImageReceiverOptions_GetSize(options, &imgSizeRead); 74 if (errCode != IMAGE_SUCCESS) { 75 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver options size failed, errCode: %{public}d.", errCode); 76 OH_ImageReceiverOptions_Release(options); 77 return; 78 } 79 80 // Check whether the size read is the same as the size set. 81 if (imgSizeRead.width != IMAGE_WIDTH || imgSizeRead.height != IMAGE_HEIGHT) { 82 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver options size failed, width: %{public}d, height: %{public}d.", imgSizeRead.width, imgSizeRead.height); 83 OH_ImageReceiverOptions_Release(options); 84 return; 85 } 86 87 // Read the capacity attribute of OH_ImageReceiverOptions. 88 int32_t capacity = 0; 89 errCode = OH_ImageReceiverOptions_GetCapacity(options, &capacity); 90 if (errCode != IMAGE_SUCCESS) { 91 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver options capacity failed, errCode: %{public}d.", errCode); 92 OH_ImageReceiverOptions_Release(options); 93 return; 94 } 95 96 // Check whether the capacity read is the same as the capacity set. 97 if (capacity != IMAGE_CAPACITY) { 98 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver options capacity failed, capacity: %{public}d.", capacity); 99 OH_ImageReceiverOptions_Release(options); 100 return; 101 } 102 103 // Create an OH_ImageReceiverNative instance. 104 OH_ImageReceiverNative* receiver = nullptr; 105 errCode = OH_ImageReceiverNative_Create(options, &receiver); 106 if (errCode != IMAGE_SUCCESS) { 107 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest create image receiver failed, errCode: %{public}d.", errCode); 108 OH_ImageReceiverOptions_Release(options); 109 return; 110 } 111 112 // Register a callback event. Each time a new image is received, the callback event is triggered. 113 uint64_t surfaceID = 0; 114 errCode = OH_ImageReceiverNative_On(receiver, OnCallback); 115 if (errCode != IMAGE_SUCCESS) { 116 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest image receiver on failed, errCode: %{public}d.", errCode); 117 OH_ImageReceiverOptions_Release(options); 118 OH_ImageReceiverNative_Release(receiver); 119 return; 120 } 121 122 // Read the surface ID attribute of OH_ImageReceiverNative. 123 uint64_t surfaceID = 0; 124 errCode = OH_ImageReceiverNative_GetReceivingSurfaceId(receiver, &surfaceID); 125 if (errCode != IMAGE_SUCCESS) { 126 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver surfaceID failed, errCode: %{public}d.", errCode); 127 OH_ImageReceiverOptions_Release(options); 128 OH_ImageReceiverNative_Release(receiver); 129 return; 130 } 131 OH_LOG_INFO(LOG_APP, "ImageReceiverNativeCTest get image receiver surfaceID: %{public}llu.", surfaceID); 132 133 // Read the size attribute of OH_ImageReceiverNative. 134 errCode = OH_ImageReceiverNative_GetSize(receiver, &imgSizeRead); 135 if (errCode != IMAGE_SUCCESS) { 136 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver size failed, errCode: %{public}d.", errCode); 137 OH_ImageReceiverOptions_Release(options); 138 OH_ImageReceiverNative_Release(receiver); 139 return; 140 } 141 OH_LOG_INFO(LOG_APP, "ImageReceiverNativeCTest get image receiver size: width = %{public}d, height = %{public}d.", imgSizeRead.width, imgSizeRead.height); 142 143 // Read the capacity attribute of OH_ImageReceiverNative. 144 errCode = OH_ImageReceiverNative_GetCapacity(receiver, &capacity); 145 if (errCode != IMAGE_SUCCESS) { 146 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver capacity failed, errCode: %{public}d.", errCode); 147 OH_ImageReceiverOptions_Release(options); 148 OH_ImageReceiverNative_Release(receiver); 149 return; 150 } 151 OH_LOG_INFO(LOG_APP, "ImageReceiverNativeCTest get image receiver capacity: %{public}d.", capacity); 152 153 // Read the next image object of OH_ImageReceiverNative. 154 OH_ImageNative* image = nullptr; 155 errCode = OH_ImageReceiverNative_ReadNextImage(receiver, &image); 156 if (errCode != IMAGE_SUCCESS) { 157 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver next image failed, errCode: %{public}d.", errCode); 158 OH_ImageReceiverOptions_Release(options); 159 OH_ImageReceiverNative_Release(receiver); 160 return; 161 } 162 163 // Release the OH_ImageNative instance. 164 errCode = OH_ImageNative_Release(image); 165 if (errCode != IMAGE_SUCCESS) { 166 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest release image native failed, errCode: %{public}d.", errCode); 167 } 168 169 // Read the latest image object of OH_ImageReceiverNative. 170 errCode = OH_ImageReceiverNative_ReadLatestImage(receiver, &image); 171 if (errCode != IMAGE_SUCCESS) { 172 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver latest image failed, errCode: %{public}d.", errCode); 173 OH_ImageReceiverOptions_Release(options); 174 OH_ImageReceiverNative_Release(receiver); 175 return; 176 } 177 178 // Release the OH_ImageNative instance. 179 errCode = OH_ImageNative_Release(image); 180 if (errCode != IMAGE_SUCCESS) { 181 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest release image native failed, errCode: %{public}d.", errCode); 182 } 183 184 // Release the OH_ImageReceiverOptions instance. 185 errCode = OH_ImageReceiverOptions_Release(options); 186 if (errCode != IMAGE_SUCCESS) { 187 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest release image receiver options failed, errCode: %{public}d.", errCode); 188 } 189 190 // Unregister the callback event registered by calling OH_ImageReceiverNative_On. 191 errCode = OH_ImageReceiverNative_Off(receiver); 192 if (errCode != IMAGE_SUCCESS) { 193 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest image receiver off failed, errCode: %{public}d.", errCode); 194 } 195 196 // Release the OH_ImageReceiverOptions instance. 197 errCode = OH_ImageReceiverNative_Release(receiver); 198 if (errCode != IMAGE_SUCCESS) { 199 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest release image receiver failed, errCode: %{public}d.", errCode); 200 } 201} 202``` 203