2015-11-24 48 views
0

为了提高我的android应用程序的性能,我决定在C++中重新编写计算部分并使用JNI。这里是问题:我的C++方法在多级循环中生成大量的对象(2k到10k)。一个对象正在最深层次上创建,并存储在jobject的向量中以供以后返回。我最后一部分的实现如下:JNI:如何删除本地参考C++

jobject genObj = env->NewObject(jclass,jmethodId,...); 
Vector.push_back(genObj); 
env->DeleteLocalRef(genObj); 

这段代码给我:

JNI错误(应用程序错误):访问过时的本地引用

这意味着我尝试访问已删除的内存块。这是意想不到的,因为push_back应该复制参数而不是它的指针。

我该怎么办?

PS:不删除本地裁判会导致表localRef所溢出

回答

0

OYou're节省Vector,本地参考将其删除,但后来使用它的Vector。你不能那样做。除非你真的完成了它,否则你不能删除它。

也许你应该看看PushLocalFrame()和朋友,如果你用尽本地参考。或者使用Java集合代替C++ Vector

+0

所以,如果你必须保持两个向量什么点向量。它没有意义。在C++中使用java集合会造成巨大的开销,并且不能完成这项工作。我认为应该有更好的办法。 –

+0

我不知道你的矢量点是什么。只有你知道这一点。我没有说任何其他的保持两个。我给了你两种方式,这足够一天。 – EJP

0

您可以使用NewGlobalRef将这些对象放在向量中创建对象的全局引用,然后删除本地引用。这样,只要你没有耗尽内存,你就可以保持你的对象在向量中。一旦不再需要它们,请确保您不要忘记使用DeleteGlobalRef删除这些全局引用,因为垃圾收集器不会收集保存在本机内存中的对象。

这里的documentation