jni-释放对象数组

| 在jni中,我们具有
GetPrimitiveArrayElements
函数来获取堆上数组元素的指针,并拥有
ReleasePrimitiveArrayElements
函数来删除数组的本地副本。 但是我将Java对象数组传递给JNI。这些数组元素是使用
GetObjectArrayElement
函数迭代到本地jobject的。 但是如何处理数组元素后如何删除jobject的本地引用。 谢谢     
已邀请:
无论您要获取的3个对象最初是在Java端分配的,还是由您的JNI方法分配的,只要没有对对象的持久引用,它们都将由垃圾回收处理。因此,如果您对
jobject
的局部引用只是局部变量,则它们将在函数末尾消失,并且在事件的正常原因中,您的对象将有资格进行垃圾回收。如果您为对象保留一个“ 5”,则该对象仍将存在,并且本地引用将像没有分配堆空间的任何本地变量一样消失。如果保留“ 6”,则可能会垃圾回收该对象,但如果不是,则该对象对于另一个JNI调用仍然有效。在JNI调用中保留对ѭ3的普通本地引用无效。 另外,如果您想立即释放本地引用而不是等待(例如,如果要在单个函数中创建大量的
jobject
引用,则只需使用JNIEnv的
DeleteLocalRef(env, jobj);
方法即可。 无论如何,文档应该告诉您我是否犯了任何错误。     
您什么也不能做,也可以叫
DeleteLocalRef()
。 从JNI规范第2章:   全球和本地参考      JNI将本机代码使用的对象引用分为两类:本地引用和全局引用。本地引用在本机方法调用期间有效,并在本机方法返回后自动释放。全局引用在显式释放之前一直保持有效。      对象作为本地引用传递给本机方法。 JNI函数返回的所有Java对象都是本地引用。 JNI允许程序员从本地引用创建全局引用。期望Java对象的JNI函数接受全局和本地引用。本机方法可能返回对VM的本地或全局引用作为其结果。      在大多数情况下,程序员应在本地方法返回后依靠VM释放所有本地引用。但是,有时程序员应该显式释放本地引用。例如,考虑以下情况:      本机方法访问大型Java对象,从而创建对该Java对象的本地引用。然后,本机方法将执行其他计算,然后再返回到调用方。即使在其余的计算中不再使用该对象,对大型Java对象的本地引用也可以防止对该对象进行垃圾回收。   本机方法会创建大量的本地引用,尽管并非同时使用所有本地引用。由于VM需要一定的空间来跟踪本地引用,因此创建太多本地引用可能会导致系统内存不足。例如,本机方法遍历大量对象,检索元素作为本地引用,并在每次迭代时对一个元素进行操作。每次迭代之后,程序员不再需要对数组元素的本地引用。      JNI允许程序员在本机方法中的任何时候手动删除本地引用。为了确保程序员可以手动释放本地引用,不允许JNI函数创建额外的本地引用,除非它们会作为结果返回引用。      本地引用仅在创建它们的线程中有效。本机代码不得将本地引用从一个线程传递到另一个线程。     

要回复问题请先登录注册