我想知道如何使用 Android Profiler 跟踪 JNI 中的内存泄漏。 我有一个使用 NDK 的应用程序,它在 JNI 中存在内存泄漏。我在 Profiler 中检查过。
JNIEXPORT jfloat JNICALL
FACE_ENGINE_METHOD(nativeExtractLiveFeature)(JNIEnv *env, jobject instance,
jobject bmp, jint left, jint top, jint right, jint bottom,
jfloatArray landmarksX, jfloatArray landmarksY, jfloatArray features)
{
cv::Mat matBGR;
ConvertBitmap2Mat(env, bmp, matBGR);
if( matBGR.empty() || matBGR.cols == 0 || matBGR.rows == 0)
return 0.0f;
LOG_DEBUG("Frame Size = (%d, %d)", matBGR.cols, matBGR.rows);
LOG_DEBUG("Face Rect = (%d, %d, %d, %d)", left, top, right, bottom);
cv::Rect rtFace;
rtFace.x = max(0, left);
rtFace.y = max(0, top);
rtFace.width = min(matBGR.cols, right) - rtFace.x;
rtFace.height = min(matBGR.rows, bottom) - rtFace.y;
Live *pLive = Live::getInstance();
float confidence = pLive->Detect(matBGR, rtFace);
LOG_DEBUG("Face Live Conf = %f", confidence);
float posLMX[5];
float posLMY[5];
jfloat* tmpLandX = env->GetFloatArrayElements(landmarksX, NULL);
jfloat* tmpLandY = env->GetFloatArrayElements(landmarksY, NULL);
for(int i = 0; i < 5; i++){
posLMX[i] = tmpLandX[i];
posLMY[i] = tmpLandY[i];
LOG_DEBUG("Landmark (x, y) = (%.2f, %.2f)", posLMX[i], posLMY[i]);
}
float feat[128];
FaceFeature *pFF = FaceFeature::getInstance();
pFF->GetFeatures(matBGR, posLMX, posLMY, feat);
LOG_DEBUG("It was finished to extract the feature");
matBGR.release();
env->SetFloatArrayRegion(features, 0, 128, (jfloat*)feat);
env->ReleaseFloatArrayElements(landmarksX, tmpLandX, 0);
env->ReleaseFloatArrayElements(landmarksY, tmpLandY, 0);
return confidence;
}
应用程序重复调用此 JNI 函数,会导致内存泄漏。 我需要使用 android Profiler 找到解决方案。
使用 Android Studio Profiler 中的本机内存分配功能,您可以使用分配的调用堆栈“可视化”,并查看是否正在分配多个实例。