我是否需要释放与参数jobjectArray相关的任何内存?

时间:2011-10-12 17:07:45

标签: java android java-native-interface

我有一个遵循JNI方法的方法

JNIEXPORT void JNICALL Java_com_android_Coordinates_Updates
(
JNIEnv * env,
jobject obj,
jobjectArray coordinates
)
    {
    int size = env->GetArrayLength(coordinates);

    for(int i = 0; i < size; i ++)
        {
        jfloatArray row = (jfloatArray)env->GetObjectArrayElement(coordinates, i);
        jfloat *elements = env->GetFloatArrayElements(row , 0);

        //Do I need to release this or any other memory?
        env->ReleaseFloatArrayElements( row , (jfloat *)elements, i);
        }  
    }

我的问题是在这种情况下我需要释放任何内存吗?

我问这个问题,因为我有一个Android应用程序,可以快速传递从Java到JNI的小数据(触摸坐标)。当我快速移动两个手指在我的Android设备上时,应用程序在15秒内崩溃。我试图缩小问题的范围,并且如果我在app app崩溃的方法中包含下面给出的行,那么它就没有了。

jfloat *elements = env->GetFloatArrayElements(row , 0);

1 个答案:

答案 0 :(得分:2)

是。使用GetXxxxArrayElements()撤消工作时,需要调用ReleaseXxxxArrayElement()。

// why did you use "i" ?
env->ReleaseFloatArrayElements( row , (jfloat *)elements, 0);
// we cleanup local ref due to looping ("size" might be large!)
env->DeleteLocalRef(row);

你有阵列数组吗?我的下面猜测是基于我在你的问题中看到的应用程序代码看起来像什么,请修改它重新发布到问题中。

Float[] firstElement = new Float[2];
firstElement[0] = 1.0f;   // x value 
firstElement[1] = 42.0f;  // y value

Object[] coordinates = new Object[1];
coordinates[0] = firstElement;

com.android.Coordinates coordObject = new com.android.Coordinates();
coordObject.Updates(coordinates);