在这里查看 JNI 文档:http://download.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html
具体的看EnsureLocalCapacity函数的描述中是怎么说的:
For backward compatibility, the VM allocates local references beyond the ensured capacity. (As a debugging support, the VM may give the user warnings that too many local references are being created. In the JDK, the programmer can supply the -verbose:jni command line option to turn on these messages.) The VM calls FatalError if no more local references can be created beyond the ensured capacity.
此外,看看 PushLocalFrame 如何接受“容量”参数。 (顺便说一下,它没有提到这是硬限制,还是像 EnsureLocalCapacity 那样的软限制)。
这些关于本地引用容量的废话到底从何而来?文档说 VM 愿意分配超出当前正式容量的引用,那么它为什么不这样做并让 API 中的所有这些容量杂乱无章?
打个比方C,感觉就像是让我预先计划我要调用多少次malloc(),感觉有点可笑。
有什么重要的东西我只是没在这里看到吗?
最佳答案
据我了解,本地引用表的大小是预定义的,如果分配的超过该大小,它就会崩溃。所以并不是说 VM 会永远给你更多的本地引用。在 Android 上使用 JNI 时,我遇到过很多次。通常很难发现这样的内存泄漏。每次使用 JNI 本地引用执行某些操作时调用 env->DeleteLocalRef() 只会使代码困惑。因此,与其使用 DeleteLocalRef() 调用使代码困惑,不如确保我们不会创建太多引用并保持代码非常干净。即使我们计划分配更多的本地引用,我们仍然可以只调用 PushLocalFrame()/PopLocalFrame() 并避免多次调用 DeleteLocalRef()。
因此,为了让您类比“C”,您需要预先计划对 malloc 的调用,以避免在最后对 free() 进行所有必要的调用。
关于java - JNI EnsureLocalCapacity——为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7081853/