gpt4 book ai didi

java - 在 JNI 和 C 中释放持久数组

转载 作者:太空宇宙 更新时间:2023-11-04 04:53:52 25 4
gpt4 key购买 nike

我正在编写一个包装器以允许 Java 访问用 C 编写的库。

JNI 调用之间需要有一个持久数组。我在调用之间保留数组地址。这种方法非常有效。我主要担心的是,当数组从 java 复制到 jni 时,内存被 JVM 释放,但同时副本保留在堆上,我可以引用它,然后在我完成后释放它。

这是这两个函数,方法是否正确,或者是否有更有效的方法来完成此任务?

数组导入到 C:

JNIEXPORT jlong JNICALL
Java_Matcher_FlannLoadData(JNIEnv *env, jobject obj, jfloatArray d, jint r, jint c)
{
int rows = (int)r;
int cols = (int)c;

float *jdataset = (*env)->GetFloatArrayElements(env,d,0);

float *cdataset = malloc(rows*cols*sizeof(float));

memcpy(cdataset,jdataset,rows*cols*sizeof(float));

(*env)->ReleaseFloatArrayElements(env,d,jdataset,0);

return (long)cdataset;
}

空闲内存:

JNIEXPORT void JNICALL
Java_Matcher_FlannFreeData(JNIEnv *env, jobject obj, jlong d)
{
free((float*)d)
}

最佳答案

我认为

  1. 如您所述,您正在制作 Java 数据的副本,Java 端的任何内容都不需要 jlong​​,您只需将其传回给 FreeData
  2. 你不坚持 C 风格的内存管理,因为你正在使用解引用 operator->

那么有一个更好的方法来做到这一点,是的。不一定更“高效”(取决于您的意思),但肯定更清晰、更易读。

float *cdataset;

JNIEXPORT void JNICALL
Java_Matcher_FlannLoadData(JNIEnv *env, jobject obj, jfloatArray d, jint r, jint c)
{
...
cdataset = new float[rows*cols];
...
}

JNIEXPORT void JNICALL
Java_Matcher_FlannFreeData(JNIEnv *env, jobject obj)
{
delete [] cdataset;
}

关于java - 在 JNI 和 C 中释放持久数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11786494/

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