如何使用 Android Studio Profiler 或其他工具跟踪 JNI 中的内存泄漏

问题描述 投票:0回答:1

我想知道如何使用 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 memory-leaks java-native-interface android-profiler
1个回答
0
投票

使用 Android Studio Profiler 中的本机内存分配功能,您可以使用分配的调用堆栈“可视化”,并查看是否正在分配多个实例。

© www.soinside.com 2019 - 2024. All rights reserved.