我的功能如下所示。并且它被执行了很多次。在某些时候它崩溃在jobject nvarObject = env-> GetObjectField(var1,nvar1)给出错误JNI错误:本地引用表溢出512个条目。
任何人都可以调查这个问题并提出一些建议。
答案 0 :(得分:20)
返回jobject
或类似对象引用的所有JNI方法都在引用表中创建本地引用。将控制权返回给JVM时,这些引用会自动清除,但如果要创建许多引用(例如,在循环中),则需要手动清理它们。
通过DeleteLocalRef
引用上的cls
调用,您走在正确的轨道上,但请注意GetObjectField
也会返回jobject
,因此返回的引用应该是在退出函数之前也删除了。
还要确保在从错误条件返回之前清理所有现有引用!
另一种方法:在循环调用的函数顶部,调用PushLocalFrame( env, 5 )
并在返回函数中的任何位置之前调用PopLocalFrame(env)
。这将自动清除在该函数调用期间创建的任何引用。第二个参数是帧中所需的本地引用数 - 如果在执行函数期间需要超过5个本地引用,请使用大于5的值。