gpt4 book ai didi

c++ - 使用 JNIEnv::FindClass:我需要释放返回的 jclass 引用吗?

转载 作者:搜寻专家 更新时间:2023-10-31 00:35:31 26 4
gpt4 key购买 nike

假设我在实现 native 函数 stub 的 JNI 函数中有这段代码:

JNIEnv* env; /*This is set to a valid JNIEnv* for this thread*/
jclass clz = env->FindClass("foo"); /*this has worked*/

我需要打电话吗

env->DeleteLocalRef(clz);

一旦我完成它?我不会将 clz 返回到 Java,所以我想我需要删除本地引用吗?这似乎有点奇怪,因为与 MethodID 一样,jclass 不包含对象实例。

最佳答案

调用 DeleteLocalRef 永远不会错,所以你应该总是调用它,否则你可能会遇到本地引用数用完的情况。

当你的 JNI 代码被 Java 调用时,它是短时间运行的,你可能很幸运,在你返回到 Java 调用者之后,本地引用会为你清理干净,但是如果你,例如从 native 代码调用 Java VM(因此没有从中调用 JNI 代码的“外部”Java VM 框架),然后您将很快用完局部变量,因为它们永远不会被不存在的 Java 调用者删除.

引用official Java documentation :


在大多数情况下,程序员应该依靠 VM 在本地方法返回后释放所有本地引用。然而,有时程序员应该显式释放一个本地引用。例如,考虑以下情况:

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

关于c++ - 使用 JNIEnv::FindClass:我需要释放返回的 jclass 引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23741224/

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