为了提高我的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表溢出
答案 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
的全局引用,因为垃圾收集器不会收集本机内存中保存的对象。