JNI错误:本地引用表溢出512个条目

时间:2014-01-04 06:27:59

标签: java android c++ java-native-interface

我的功能如下所示。并且它被执行了很多次。在某些时候它崩溃在jobject nvarObject = env-> GetObjectField(var1,nvar1)给出错误JNI错误:本地引用表溢出512个条目。

任何人都可以调查这个问题并提出一些建议。

1 个答案:

答案 0 :(得分:20)

返回jobject或类似对象引用的所有JNI方法都在引用表中创建本地引用。将控制权返回给JVM时,这些引用会自动清除,但如果要创建许多引用(例如,在循环中),则需要手动清理它们。

通过DeleteLocalRef引用上的cls调用,您走在正确的轨道上,但请注意GetObjectField也会返回jobject,因此返回的引用应该是在退出函数之前也删除了。

还要确保在从错误条件返回之前清理所有现有引用!

另一种方法:在循环调用的函数顶部,调用PushLocalFrame( env, 5 )并在返回函数中的任何位置之前调用PopLocalFrame(env)。这将自动清除在该函数调用期间创建的任何引用。第二个参数是帧中所需的本地引用数 - 如果在执行函数期间需要超过5个本地引用,请使用大于5的值。