我正在开发一个与一些本机 C++ 代码 (JNI) 接口的 Android 应用程序。在 Java 方面,我将一个查找表(双精度数组)和两个 Open-CV 矩阵传递给 JNI(通过引用),然后使用 C++ 处理这些矩阵。虽然 JNI 函数调用在前 15~20 次有效,但应用程序很快就会崩溃并重新启动。我 99% 确信这是我没有正确释放堆上内存的问题。
我查看了 Profiler 以检查内存的情况,发现每个 JNI 函数调用的内存使用量都在持续增加。大部分内存分配似乎都在 Native 部分,您可以在下图中看到这种增加(增加与对 JNI 函数的调用一致)。
extern "C" JNIEXPORT void JNICALL
Java_com_mygroup_productName_ImgProcUtils_interpVals(
JNIEnv *env,
jobject /* this */,
jlong addrKSqrd,
jint nRows,
jint nCols,
jdoubleArray yTaucVal,
jlong addrTauc) {
cv::Mat& kSqrd = *(cv::Mat*)addrKSqrd;
cv::Mat& Tauc = *(cv::Mat*)addrTauc;
jboolean isCopy;
jdouble *elem = env->GetDoubleArrayElements(yTaucVal, &isCopy);
float pixel;
for (int i = 0; i < nRows; i++) {
for (int j = 0; j < nCols; j++) {
pixel = kSqrd.at<float>(i, j);
int value = (int)round(pixel * 65535);
if (value < 0) {
value = 0;
} else if (value > 65535) {
value = 65535;
}
Tauc.at<float>(i,j) = (jfloat)elem[value];
}
}
env->ReleaseDoubleArrayElements(yTaucVal, elem, JNI_ABORT);
}
正如您所看到的,我正在释放 for 循环之前“获取”的双数组,但似乎我们仍然有未释放的内存。我还需要做其他事情才能正确释放内存吗?我还需要发布任何其他数据吗?
MMMHUHU
相关分类