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