gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:08:53 24 4
gpt4 key购买 nike

我有一个具有以下 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 秒内崩溃。我试图缩小问题范围,并发现如果我在上面的方法中包含下面给出的行,应用程序就会崩溃,否则不会。

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

最佳答案

是的。使用 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);

关于java - 我是否需要释放与参数 jobjectArray 关联的任何内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7743819/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com