JNI:如何删除本地引用c ++

时间:2015-11-24 17:36:43

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

为了提高我的Android应用程序的性能,我决定用c ++重写计算部分并使用JNI。这是问题:

我的c ++方法在多级循环中生成非常大量的对象(2k到10k)。正在最深层次创建一个对象,并将其存储在jobject的向量中,以便以后返回。我对最后一部分的实现如下:

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

这段代码给了我:

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

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

我该怎么办?

Ps:不删除本地引用会导致localref表溢出

2 个答案:

答案 0 :(得分:0)

您是否在Vector,删除了本地引用,但稍后在Vector之后使用它。你不能这样做。在您真正完成它之前,您无法将其删除。

如果你的本地参考资料不足,也许你应该调查PushLocalFrame()和朋友。

或者使用Java集合而不是C ++ Vector

答案 1 :(得分:0)

您可以使用tcus = request.user.tcu_set.exclude(position_set__isnull=True).prefetch_related('position_set') positions = [ tcu.position_set.order_by('-id').values('latitude','longitude')[0] for tcu in tcus ] 创建对象的全局引用,将它们放在向量中,然后删除本地引用。这样,只要您的内存不足,就可以将对象保存在向量中。一旦您不再需要,请确保不要忘记删除带有NewGlobalRef的全局引用,因为垃圾收集器不会收集本机内存中保存的对象。

这里是documentation