2015-11-24 50 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