我的函数如下所示。它被执行了多次。在某个时刻,当 jobject nvarObject = env->GetObjectField (var1, nvar1) 执行时,它会崩溃,并出现 JNI 错误: Local reference table overflow 512 entries.
有谁能够查看一下这个问题并提供一些帮助呢?
我的函数如下所示。它被执行了多次。在某个时刻,当 jobject nvarObject = env->GetObjectField (var1, nvar1) 执行时,它会崩溃,并出现 JNI 错误: Local reference table overflow 512 entries.
有谁能够查看一下这个问题并提供一些帮助呢?
所有返回 jobject
或类似对象引用的JNI方法都会在引用表中创建本地引用。当你将控制权返回给JVM时,这些引用会自动清理,但如果你正在创建许多引用(例如,在循环中),则需要手动清理它们。
通过在 cls
引用上调用 DeleteLocalRef
,你已经做得很好了,但请注意,GetObjectField
也返回一个 jobject
,因此在退出函数之前应该删除其中返回的引用。
还要确保在从错误条件返回之前清理任何现有的引用!
另一种方法是:在调用循环中的函数顶部,调用 PushLocalFrame(env, 5)
,并在函数中任何返回的位置之前调用 PopLocalFrame(env)
。这将自动清理在该函数调用期间创建的所有引用。第二个参数是帧中您想要的本地引用数——如果在函数执行期间需要超过5个本地引用,请使用比5更高的值。
PushLocalFrame
/PopLocalFrame
。当您调用PopLocalFrame
时,最后一次调用PushLocalFrame
之后创建的本地引用将被删除。这比跟踪创建本地引用的所有位置更方便。 - Jason LeBrun