Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jni-释放对象数组_Java_Java Native Interface - Fatal编程技术网

Java jni-释放对象数组

Java jni-释放对象数组,java,java-native-interface,Java,Java Native Interface,在jni中,我们有GetPrimitiveArrayElements函数来获取堆上数组元素的指针,还有ReleasePrimitiveArrayElements来删除数组的本地副本 然而,我将java对象数组传递给JNI。这些数组元素使用GetObjectArrayElement函数迭代到本地jobject 但是在处理数组元素之后,如何删除jobject的本地引用呢 感谢,不管您获取的jobjects最初是在Java端分配的,还是通过您的JNI方法分配的,只要没有对对象的持久引用。因此,如果对j

在jni中,我们有
GetPrimitiveArrayElements
函数来获取堆上数组元素的指针,还有
ReleasePrimitiveArrayElements
来删除数组的本地副本

然而,我将java对象数组传递给JNI。这些数组元素使用
GetObjectArrayElement
函数迭代到本地jobject

但是在处理数组元素之后,如何删除jobject的本地引用呢


感谢

,不管您获取的
jobject
s最初是在Java端分配的,还是通过您的JNI方法分配的,只要没有对对象的持久引用。因此,如果对
jobject
s的本地引用只是本地变量,它们将在函数结束时消失,并且对象将符合事件正常原因下的垃圾收集条件。如果保留对象的
GlobalRef
,则该对象仍将存在,并且本地引用将像未分配堆空间的任何本地变量一样消失)。如果您保留一个
WeakRef
,对象可能会被垃圾收集,但如果不是,它对于另一个JNI调用仍然有效。在JNI调用中保留对
jobject
的普通本地引用是无效的

另外,如果您想立即释放本地引用而不等待(比如在单个函数中创建大量的
jobject
引用),只需使用JNIEnv的
DeleteLocalRef(env,jobj);
方法即可


在任何情况下,如果我犯了任何错误,你都应该告诉你你需要知道的一切。

你可以什么也不做,也可以调用
DeleteLocalRef()

从:

全局和局部引用

JNI将本机代码使用的对象引用分为两类:本地引用和全局引用。本地引用在本机方法调用期间有效,并在本机方法返回后自动释放。全局引用在显式释放之前保持有效

对象作为本地引用传递给本机方法。JNI函数返回的所有Java对象都是本地引用。JNI允许程序员从本地引用创建全局引用。期望Java对象的JNI函数同时接受全局引用和本地引用。本机方法可以将本地或全局引用返回给VM作为其结果

在大多数情况下,程序员应依赖于VM在本地方法返回之后释放所有本地引用。然而,程序员有时应该明确地释放本地引用。 本机方法访问大型Java对象,从而创建对该Java对象的本地引用。然后,本机方法在返回调用方之前执行额外的计算。对大型Java对象的本地引用将防止该对象被垃圾收集,即使该对象不再在剩余的调用中使用e计算。 本机方法会创建大量本地引用,但并非所有本地引用都同时使用。由于VM需要一定的空间来跟踪本地引用,因此创建太多本地引用可能会导致系统内存不足。例如,本机方法会在大量对象数组中循环,检索元素作为本地引用,并在每次迭代中对一个元素进行操作。每次迭代后,程序员不再需要对数组元素的本地引用

JNI允许程序员在本机方法内的任何点手动删除本地引用。为了确保程序员可以手动释放本地引用,不允许JNI函数创建额外的本地引用,但它们作为结果返回的引用除外

本地引用仅在创建它们的线程中有效。本机代码不得将本地引用从一个线程传递到另一个线程


@Nitrex88抱歉。我的否决票是个错误。我错了。我不能取消它,因为你的答案太旧了。编辑它,我会向上投票。@manuell编辑过,但很难理解为什么你会向上投票你在自己的答案中描述为“完全错误”的答案。这并不是说它不正确。