做安卓jni相关开发的总会在涉及到jni变量释放时怀疑人生,what? where? when? who? why? how? how much?
最近碰到一个比较奇怪的问题,有一个jni方法的耗时在随着调用次数的增加而上涨,但是没有明显的内存泄漏,经过我缜密分析之后,终于解决了深埋多年的疑惑。代码如下:
void HENativeUtils::vectorFloatToJArray(JNIEnv* env, const std::vector<float>& src, jobject obj, jfieldID fieldId)
{
jfloatArray jArray = ( jfloatArray )env->GetObjectField(obj, fieldId);
if (!jArray || env->GetArrayLength(jArray) != src.size())
{
jArray = env->NewFloatArray(src.size());
env->SetObjectField(obj, fieldId, jArray);
}
jfloat* array = env->GetFloatArrayElements(jArray, nullptr);
std::copy(src.begin(), src.end(), array);
env->ReleaseFloatArrayElements(jArray, array, 0);
}
这个方法提供了对一个java对象obj中的float[]成员变量进行操作的功能,如果该对象为空或者size与需要被设置的对象size不一致则创建一个新的float[]并覆盖该对象。从上面代码可知我在使用完成后已经调用env->ReleaseFloatArrayElements将对应的jni数组释放,为什么还存在泄漏?甚至有动手能力比较强的小伙伴如果把这段代码复制到自己的jni代码中去调用,可能也不会有泄漏。
关于类

本文讨论了在AndroidJNI开发中遇到的内存泄漏问题,重点在于理解JNI方法在不同线程环境下对jfloatArray等对象的正确管理,包括何时使用DetachCurrentThread和DeleteLocalRef以避免内存泄漏。
最低0.47元/天 解锁文章
2196

被折叠的 条评论
为什么被折叠?



