Commit b6c85a1ee67ed516db7df4041ddff3e14f9c04da
1 parent
d708ccb3
修复jni中解码失败导致的内存泄露问题
Showing
1 changed file
with
95 additions
and
99 deletions
jni/VehicleNativeInterface.cpp
@@ -6,6 +6,7 @@ | @@ -6,6 +6,7 @@ | ||
6 | #include <string> | 6 | #include <string> |
7 | #include <string.h> | 7 | #include <string.h> |
8 | #include <chrono> | 8 | #include <chrono> |
9 | +#include <mutex> | ||
9 | 10 | ||
10 | #include "../src/village_pic_interface.h" | 11 | #include "../src/village_pic_interface.h" |
11 | 12 | ||
@@ -17,6 +18,7 @@ | @@ -17,6 +18,7 @@ | ||
17 | //dvpp���� | 18 | //dvpp���� |
18 | #include "dvpp_process.h" | 19 | #include "dvpp_process.h" |
19 | #include "utils.h" | 20 | #include "utils.h" |
21 | +#include "logger.hpp" | ||
20 | //#include "img_codec.h" | 22 | //#include "img_codec.h" |
21 | 23 | ||
22 | double msecond() { | 24 | double msecond() { |
@@ -111,6 +113,11 @@ sy_command global_vehicle_manned_config; //�Ƿ������� | @@ -111,6 +113,11 @@ sy_command global_vehicle_manned_config; //�Ƿ������� | ||
111 | //sy_command global_vehicle_pose_config; //�Ƿ�����pose��� //20210618 atlas | 113 | //sy_command global_vehicle_pose_config; //�Ƿ�����pose��� //20210618 atlas |
112 | 114 | ||
113 | int gpu_id; | 115 | int gpu_id; |
116 | +DvppProcess* dvpp = nullptr; | ||
117 | +aclrtContext ctx = nullptr; | ||
118 | +aclrtStream stream = nullptr; | ||
119 | + | ||
120 | +std::mutex m_single_mtx; | ||
114 | 121 | ||
115 | /* | 122 | /* |
116 | * Class: com_objecteye_nativeinterface_vehicle_VehicleNativeInterface | 123 | * Class: com_objecteye_nativeinterface_vehicle_VehicleNativeInterface |
@@ -151,16 +158,20 @@ JNIEXPORT jint JNICALL Java_com_objecteye_nativeinterface_vehicle_VehicleNativeI | @@ -151,16 +158,20 @@ JNIEXPORT jint JNICALL Java_com_objecteye_nativeinterface_vehicle_VehicleNativeI | ||
151 | param.log_days = aiEngineParam_logDays; | 158 | param.log_days = aiEngineParam_logDays; |
152 | param.log_mem = aiEngineParam_logMem; | 159 | param.log_mem = aiEngineParam_logMem; |
153 | 160 | ||
154 | - printf("jni dev_id:%d \n", param.dev_id); | ||
155 | - printf("jni sdk_path:%s_\n", param.sdk_path.c_str()); | ||
156 | - printf("jni log_level:%d\n", param.log_level); | ||
157 | - printf("jni log_path:%s\n", param.log_path.c_str()); | ||
158 | - printf("jni log_days:%d\n", param.log_days); | ||
159 | - printf("jni log_mem:%ld\n", param.log_mem); | 161 | + |
162 | + string log_path = param.log_path + "/jni.log"; | ||
163 | + set_default_logger(LogLevel(param.log_level), "PicAnalysis", log_path.c_str(), param.log_mem, param.log_days); | ||
164 | + | ||
165 | + LOG_INFO("jni dev_id:{}", param.dev_id); | ||
166 | + LOG_INFO("jni sdk_path:{}", param.sdk_path.c_str()); | ||
167 | + LOG_INFO("jni log_level:{}", param.log_level); | ||
168 | + LOG_INFO("jni log_path:{}", param.log_path.c_str()); | ||
169 | + LOG_INFO("jni log_days:{}", param.log_days); | ||
170 | + LOG_INFO("jni log_mem:{}", param.log_mem); | ||
160 | 171 | ||
161 | int ret = village_pic_init(&vaHandle, param); | 172 | int ret = village_pic_init(&vaHandle, param); |
162 | if (ret != SUCCESS) { | 173 | if (ret != SUCCESS) { |
163 | - printf("jni info:va_init failed."); | 174 | + LOG_ERROR("jni village_pic_init failed."); |
164 | return ret; | 175 | return ret; |
165 | } | 176 | } |
166 | 177 | ||
@@ -182,33 +193,21 @@ JNIEXPORT jint JNICALL Java_com_objecteye_nativeinterface_vehicle_VehicleNativeI | @@ -182,33 +193,21 @@ JNIEXPORT jint JNICALL Java_com_objecteye_nativeinterface_vehicle_VehicleNativeI | ||
182 | env->SetLongArrayRegion(handle, 0, 1, temp); | 193 | env->SetLongArrayRegion(handle, 0, 1, temp); |
183 | } | 194 | } |
184 | env->ReleaseStringUTFChars(str_sdk_path, sdk_path); | 195 | env->ReleaseStringUTFChars(str_sdk_path, sdk_path); |
185 | - return ret; | ||
186 | -} | 196 | + env->ReleaseStringUTFChars(str_aiEngineParam_logPath, aiEngineParam_logPath); |
187 | 197 | ||
198 | + ACL_CALL(aclrtCreateContext(&ctx, gpu_id), ACL_ERROR_NONE, FAILED); | ||
199 | + ACL_CALL(aclrtSetCurrentContext(ctx), ACL_ERROR_NONE, FAILED); | ||
188 | 200 | ||
201 | + ACL_CALL(aclrtCreateStream(&stream), ACL_ERROR_NONE, FAILED); | ||
202 | + | ||
203 | + dvpp = new DvppProcess(); | ||
204 | + dvpp->InitResource(stream); | ||
189 | 205 | ||
190 | -void CvBGR2NV21(cv::Mat& bgr, unsigned char* yuv) { | ||
191 | - int stride = (bgr.cols + 127) / 128 * 128; | ||
192 | - int strideH = (bgr.rows + 15) / 16 * 16; | ||
193 | - for (int i = 0; i < bgr.rows; i++) { | ||
194 | - for (int j = 0; j < bgr.cols; j++) { | ||
195 | - int B = bgr.at<cv::Vec3b>(i, j)[0]; | ||
196 | - int G = bgr.at<cv::Vec3b>(i, j)[1]; | ||
197 | - int R = bgr.at<cv::Vec3b>(i, j)[2]; | 206 | + LOG_ERROR("jni init succeed."); |
198 | 207 | ||
199 | - int Y = (77 * R + 150 * G + 29 * B) >> 8; | ||
200 | - yuv[i * stride + j] = (Y < 0) ? 0 : ((Y > 255) ? 255 : Y); | ||
201 | - if (i % 2 == 0 && j % 2 == 0) { | ||
202 | - int U = ((-44 * R - 87 * G + 131 * B) >> 8) + 128; | ||
203 | - int V = ((131 * R - 110 * G - 21 * B) >> 8) + 128; | ||
204 | - yuv[strideH * stride + i / 2 * stride + j] = (V < 0) ? 0 : ((V > 255) ? 255 : V); | ||
205 | - yuv[strideH * stride + i / 2 * stride + j + 1] = (U < 0) ? 0 : ((U > 255) ? 255 : U); | ||
206 | - } | ||
207 | - } | ||
208 | - } | 208 | + return ret; |
209 | } | 209 | } |
210 | 210 | ||
211 | - | ||
212 | /* | 211 | /* |
213 | * Class: com_objecteye_nativeinterface_vehicle_VehicleNativeInterface | 212 | * Class: com_objecteye_nativeinterface_vehicle_VehicleNativeInterface |
214 | * Method: batch | 213 | * Method: batch |
@@ -218,35 +217,25 @@ JNIEXPORT jint JNICALL Java_com_objecteye_nativeinterface_vehicle_VehicleNativeI | @@ -218,35 +217,25 @@ JNIEXPORT jint JNICALL Java_com_objecteye_nativeinterface_vehicle_VehicleNativeI | ||
218 | { | 217 | { |
219 | int ret = FAILED; | 218 | int ret = FAILED; |
220 | void *vaHandle = (void *)handle; | 219 | void *vaHandle = (void *)handle; |
220 | + if (nullptr == vaHandle || nullptr == dvpp || nullptr == stream || nullptr == ctx) | ||
221 | + { | ||
222 | + return ret; | ||
223 | + } | ||
224 | + | ||
225 | + std::lock_guard<std::mutex> l(m_single_mtx); | ||
221 | 226 | ||
222 | - // ��ȡͼƬ���� | ||
223 | jclass cls_syImgParam = env->FindClass("com/objecteye/pojo/common/SyImgParam"); | 227 | jclass cls_syImgParam = env->FindClass("com/objecteye/pojo/common/SyImgParam"); |
224 | jfieldID fid_image_str = env->GetFieldID(cls_syImgParam, "image_string", "Ljava/lang/String;");//base64�����ⲿͳһ��url��fileת��base64���� | 228 | jfieldID fid_image_str = env->GetFieldID(cls_syImgParam, "image_string", "Ljava/lang/String;");//base64�����ⲿͳһ��url��fileת��base64���� |
225 | 229 | ||
226 | sy_img batch_img[batchSize]; | 230 | sy_img batch_img[batchSize]; |
227 | - cv::Mat car_images[batchSize]; | ||
228 | ImageData dvpp_data[batchSize]; | 231 | ImageData dvpp_data[batchSize]; |
229 | 232 | ||
230 | - aclrtContext ctx; | ||
231 | - ACL_CALL(aclrtCreateContext(&ctx, gpu_id), ACL_ERROR_NONE, FAILED); | ||
232 | ACL_CALL(aclrtSetCurrentContext(ctx), ACL_ERROR_NONE, FAILED); | 233 | ACL_CALL(aclrtSetCurrentContext(ctx), ACL_ERROR_NONE, FAILED); |
233 | - //��ʼ��dvpp | ||
234 | - aclrtStream stream = nullptr; | ||
235 | - ACL_CALL(aclrtCreateStream(&stream), ACL_ERROR_NONE, FAILED); | ||
236 | - | ||
237 | - DvppProcess* dvpp = new DvppProcess(); | ||
238 | - dvpp->InitResource(stream); | ||
239 | - //Base64Utils decoder(); | ||
240 | - | ||
241 | - | ||
242 | - //wh20210623 | ||
243 | - std::shared_ptr<uint8_t> NV21data[batchSize]; | ||
244 | - | ||
245 | 234 | ||
246 | - if (format != 0 && format != 1) | 235 | + if (format != 1) |
247 | { | 236 | { |
248 | - printf("ERROR FORMAT TYPE: %d\n", format); | ||
249 | - return -1; | 237 | + LOG_ERROR("ERROR FORMAT TYPE: {}", format); |
238 | + return FAILED; | ||
250 | } | 239 | } |
251 | 240 | ||
252 | double t1,t2,t3; | 241 | double t1,t2,t3; |
@@ -258,48 +247,44 @@ JNIEXPORT jint JNICALL Java_com_objecteye_nativeinterface_vehicle_VehicleNativeI | @@ -258,48 +247,44 @@ JNIEXPORT jint JNICALL Java_com_objecteye_nativeinterface_vehicle_VehicleNativeI | ||
258 | jstring imageString1 = (jstring)env->GetObjectField(syImgParam, fid_image_str); | 247 | jstring imageString1 = (jstring)env->GetObjectField(syImgParam, fid_image_str); |
259 | const char *image_str = env->GetStringUTFChars(imageString1, JNI_FALSE); | 248 | const char *image_str = env->GetStringUTFChars(imageString1, JNI_FALSE); |
260 | string imageString = image_str; | 249 | string imageString = image_str; |
261 | - | ||
262 | - //printf("format = %d\n", format); | ||
263 | - if (format == 0) //url | ||
264 | - { | ||
265 | - printf("url is not surposed \n"); | ||
266 | - } | ||
267 | - else | ||
268 | - { | ||
269 | - | ||
270 | - string decode_str; | ||
271 | - //decode_str = decoder->Decode(encode_str[b].data(), encode_str[b].size()); | ||
272 | - decode_str = Decode(imageString.data(), imageString.size()); | ||
273 | - | ||
274 | - //debug======================================================== | ||
275 | - ImageData src; | ||
276 | - uint32_t binFileBufferLen = decode_str.size() + 8;//�ֽ��� | ||
277 | - uint8_t* binFileBufferData = new(std::nothrow) uint8_t[binFileBufferLen]; | ||
278 | - | ||
279 | - if (binFileBufferData == nullptr) { | ||
280 | - ERROR_LOG("malloc binFileBufferData failed"); | ||
281 | - return FAILED; | ||
282 | - } | ||
283 | - | ||
284 | - memcpy((char *)binFileBufferData, decode_str.data(), binFileBufferLen); | ||
285 | - int32_t ch = 0; | ||
286 | - ACL_CALL(acldvppJpegGetImageInfo(binFileBufferData, binFileBufferLen, | ||
287 | - &(src.width), &(src.height), &ch), SUCCESS, FAILED); | ||
288 | - src.data.reset(binFileBufferData, [](uint8_t* p) { delete[](p); }); | ||
289 | - src.size = binFileBufferLen; | ||
290 | - // printf("vpdr_api_batch:img.w=%d ,img.h=%d \n",src.width,src.height); | ||
291 | 250 | ||
292 | - | ||
293 | - ACL_CALL(dvpp->CvtJpegToYuv420sp(dvpp_data[i], src), SUCCESS, FAILED); | ||
294 | - | ||
295 | - batch_img[i].w_ = dvpp_data[i].width;//dvpp_data[b].alignWidth; | ||
296 | - batch_img[i].h_ = dvpp_data[i].height;//dvpp_data[b].alignHeight; | ||
297 | - //batch_img[i].data_ = (uint8_t*)Utils::CopyDataDeviceToLocal(dvpp_data[i].data.get(), dvpp_data[i].size);//dvpp_data[b].data.get(); | ||
298 | - batch_img[i].data_ = dvpp_data[i].data.get(); | ||
299 | - | ||
300 | - } | ||
301 | - | ||
302 | - env->ReleaseStringUTFChars(imageString1, image_str); | 251 | + string decode_str; |
252 | + //decode_str = decoder->Decode(encode_str[b].data(), encode_str[b].size()); | ||
253 | + decode_str = Decode(imageString.data(), imageString.size()); | ||
254 | + env->ReleaseStringUTFChars(imageString1, image_str); | ||
255 | + | ||
256 | + //debug======================================================== | ||
257 | + ImageData src; | ||
258 | + uint32_t binFileBufferLen = decode_str.size() + 8;//�ֽ��� | ||
259 | + uint8_t* binFileBufferData = new(std::nothrow) uint8_t[binFileBufferLen]; | ||
260 | + | ||
261 | + if (binFileBufferData == nullptr) { | ||
262 | + LOG_ERROR("malloc binFileBufferData failed"); | ||
263 | + return FAILED; | ||
264 | + } | ||
265 | + | ||
266 | + src.data.reset(binFileBufferData, [](uint8_t* p) { delete[](p); }); | ||
267 | + | ||
268 | + memcpy((char *)binFileBufferData, decode_str.data(), binFileBufferLen); | ||
269 | + int32_t ch = 0; | ||
270 | + ret = acldvppJpegGetImageInfo(binFileBufferData, binFileBufferLen, &(src.width), &(src.height), &ch); | ||
271 | + if (SUCCESS != ret) { | ||
272 | + LOG_ERROR("acldvppJpegGetImageInfo failed"); | ||
273 | + return FAILED; | ||
274 | + } | ||
275 | + | ||
276 | + src.size = binFileBufferLen; | ||
277 | + | ||
278 | + ret = dvpp->CvtJpegToYuv420sp(dvpp_data[i], src); | ||
279 | + if (SUCCESS != ret) { | ||
280 | + LOG_ERROR("CvtJpegToYuv420sp failed"); | ||
281 | + return FAILED; | ||
282 | + } | ||
283 | + | ||
284 | + batch_img[i].w_ = dvpp_data[i].width;//dvpp_data[b].alignWidth; | ||
285 | + batch_img[i].h_ = dvpp_data[i].height;//dvpp_data[b].alignHeight; | ||
286 | + //batch_img[i].data_ = (uint8_t*)Utils::CopyDataDeviceToLocal(dvpp_data[i].data.get(), dvpp_data[i].size);//dvpp_data[b].data.get(); | ||
287 | + batch_img[i].data_ = dvpp_data[i].data.get(); | ||
303 | } | 288 | } |
304 | t2 = msecond(); | 289 | t2 = msecond(); |
305 | //printf("va jni info:decode time: %.2f\n", (t2 - t1)); | 290 | //printf("va jni info:decode time: %.2f\n", (t2 - t1)); |
@@ -309,8 +294,8 @@ JNIEXPORT jint JNICALL Java_com_objecteye_nativeinterface_vehicle_VehicleNativeI | @@ -309,8 +294,8 @@ JNIEXPORT jint JNICALL Java_com_objecteye_nativeinterface_vehicle_VehicleNativeI | ||
309 | std::vector<AnalysisResult> vec_result = village_pic_analysis(vaHandle, batch_img, batchSize); | 294 | std::vector<AnalysisResult> vec_result = village_pic_analysis(vaHandle, batch_img, batchSize); |
310 | if (vec_result.size() <= 0 || vec_result.size() != batchSize) | 295 | if (vec_result.size() <= 0 || vec_result.size() != batchSize) |
311 | { | 296 | { |
312 | - printf("jni info:village_pic_analysis failed."); | ||
313 | - return -1; | 297 | + LOG_ERROR("village_pic_analysis failed."); |
298 | + return FAILED; | ||
314 | } | 299 | } |
315 | cout << "result size:" << vec_result.size() << endl; | 300 | cout << "result size:" << vec_result.size() << endl; |
316 | 301 | ||
@@ -344,7 +329,7 @@ JNIEXPORT jint JNICALL Java_com_objecteye_nativeinterface_vehicle_VehicleNativeI | @@ -344,7 +329,7 @@ JNIEXPORT jint JNICALL Java_com_objecteye_nativeinterface_vehicle_VehicleNativeI | ||
344 | jclass cls_StainVplateResultParam = env->FindClass("com/objecteye/pojo/vehicle/StainVplateResultParam"); | 329 | jclass cls_StainVplateResultParam = env->FindClass("com/objecteye/pojo/vehicle/StainVplateResultParam"); |
345 | if (nullptr == cls_StainVplateResultParam) | 330 | if (nullptr == cls_StainVplateResultParam) |
346 | { | 331 | { |
347 | - cout << "cls_StainVplateResultParam find class error!" << endl; | 332 | + LOG_ERROR("cls_StainVplateResultParam find class error!"); |
348 | } | 333 | } |
349 | 334 | ||
350 | jclass cls_MannedResultParam = env->FindClass("com/objecteye/pojo/vehicle/MannedResultParam"); | 335 | jclass cls_MannedResultParam = env->FindClass("com/objecteye/pojo/vehicle/MannedResultParam"); |
@@ -366,13 +351,13 @@ JNIEXPORT jint JNICALL Java_com_objecteye_nativeinterface_vehicle_VehicleNativeI | @@ -366,13 +351,13 @@ JNIEXPORT jint JNICALL Java_com_objecteye_nativeinterface_vehicle_VehicleNativeI | ||
366 | jmethodID mid_VplateResult = env->GetMethodID(cls_VplateResult, "<init>", "(Lcom/objecteye/pojo/common/SyRectParam;F[Lcom/objecteye/pojo/vehicle/VehiclePlateNumParam;FIILcom/objecteye/pojo/vehicle/StainVplateResultParam;)V"); | 351 | jmethodID mid_VplateResult = env->GetMethodID(cls_VplateResult, "<init>", "(Lcom/objecteye/pojo/common/SyRectParam;F[Lcom/objecteye/pojo/vehicle/VehiclePlateNumParam;FIILcom/objecteye/pojo/vehicle/StainVplateResultParam;)V"); |
367 | if (nullptr == mid_VplateResult) | 352 | if (nullptr == mid_VplateResult) |
368 | { | 353 | { |
369 | - cout << "mid_VplateResult GetMethodID error!" << endl; | 354 | + LOG_ERROR("mid_VplateResult GetMethodID error!"); |
370 | } | 355 | } |
371 | jmethodID mid_VehiclePendantDetResult = env->GetMethodID(cls_VehiclePendantDetResult, "<init>", "([Lcom/objecteye/pojo/vehicle/VehiclePendantDetectInfoParam;I)V"); | 356 | jmethodID mid_VehiclePendantDetResult = env->GetMethodID(cls_VehiclePendantDetResult, "<init>", "([Lcom/objecteye/pojo/vehicle/VehiclePendantDetectInfoParam;I)V"); |
372 | jmethodID mid_VehicleIllegalDetResult = env->GetMethodID(cls_VehicleIllegalDetResult, "<init>", "(Lcom/objecteye/pojo/vehicle/VehicleIllegalDetectInfoParam;Lcom/objecteye/pojo/vehicle/VehicleIllegalDetectInfoParam;)V"); | 357 | jmethodID mid_VehicleIllegalDetResult = env->GetMethodID(cls_VehicleIllegalDetResult, "<init>", "(Lcom/objecteye/pojo/vehicle/VehicleIllegalDetectInfoParam;Lcom/objecteye/pojo/vehicle/VehicleIllegalDetectInfoParam;)V"); |
373 | if (nullptr == mid_VehicleIllegalDetResult) | 358 | if (nullptr == mid_VehicleIllegalDetResult) |
374 | { | 359 | { |
375 | - cout << "mid_VehicleIllegalDetResult GetMethodID error!" << endl; | 360 | + LOG_ERROR("mid_VehicleIllegalDetResult GetMethodID error!"); |
376 | } | 361 | } |
377 | jmethodID mid_VehicleFeaResult = env->GetMethodID(cls_VehicleFeaResult, "<init>", "([F)V"); | 362 | jmethodID mid_VehicleFeaResult = env->GetMethodID(cls_VehicleFeaResult, "<init>", "([F)V"); |
378 | jmethodID mid_SyRect = env->GetMethodID(cls_SyRect, "<init>", "(IIII)V"); | 363 | jmethodID mid_SyRect = env->GetMethodID(cls_SyRect, "<init>", "(IIII)V"); |
@@ -618,12 +603,6 @@ JNIEXPORT jint JNICALL Java_com_objecteye_nativeinterface_vehicle_VehicleNativeI | @@ -618,12 +603,6 @@ JNIEXPORT jint JNICALL Java_com_objecteye_nativeinterface_vehicle_VehicleNativeI | ||
618 | env->SetObjectArrayElement(vehicleAnalysisResultParams, i, vehicleAnalysisResult); | 603 | env->SetObjectArrayElement(vehicleAnalysisResultParams, i, vehicleAnalysisResult); |
619 | } | 604 | } |
620 | 605 | ||
621 | - ACL_CALL(aclrtSetCurrentContext(ctx), ACL_ERROR_NONE, FAILED); | ||
622 | - delete dvpp; | ||
623 | - dvpp = nullptr; | ||
624 | - (void) aclrtDestroyStream(stream); | ||
625 | - aclrtDestroyContext(ctx); | ||
626 | - | ||
627 | return SUCCESS; | 606 | return SUCCESS; |
628 | } | 607 | } |
629 | 608 | ||
@@ -639,6 +618,23 @@ JNIEXPORT void JNICALL Java_com_objecteye_nativeinterface_vehicle_VehicleNativeI | @@ -639,6 +618,23 @@ JNIEXPORT void JNICALL Java_com_objecteye_nativeinterface_vehicle_VehicleNativeI | ||
639 | { | 618 | { |
640 | village_pic_release(&vaHandle); | 619 | village_pic_release(&vaHandle); |
641 | } | 620 | } |
621 | + | ||
622 | + if (ctx) { | ||
623 | + aclrtSetCurrentContext(ctx); | ||
624 | + } | ||
625 | + | ||
626 | + if (dvpp) { | ||
627 | + delete dvpp; | ||
628 | + dvpp = nullptr; | ||
629 | + } | ||
630 | + | ||
631 | + if (stream) { | ||
632 | + (void) aclrtDestroyStream(stream); | ||
633 | + } | ||
634 | + | ||
635 | + if (ctx) { | ||
636 | + aclrtDestroyContext(ctx); | ||
637 | + } | ||
642 | } | 638 | } |
643 | 639 | ||
644 | /* | 640 | /* |