所以我注意到我的应用程序在重复调用以下方法后崩溃。对JNI方法的重复调用使应用程序崩溃
JNIEXPORT void JNICALL Java_com_kitware_VolumeRender_VolumeRenderLib_DummyFunction(JNIEnv * env,jobject obj, jlong udp, jdoubleArray rotation, jdoubleArray translation){
jboolean isCopy1, isCopy2 ;
jdouble* rot = env->GetDoubleArrayElements(rotation,&isCopy1);
jdouble* trans = env->GetDoubleArrayElements(translation,&isCopy2);
if(isCopy1 == JNI_TRUE){
env->ReleaseDoubleArrayElements(rotation,rot, JNI_ABORT);
}
if(isCopy2 == JNI_TRUE){
env->ReleaseDoubleArrayElements(translation,trans, JNI_ABORT);
}
}
我以为这将是由于一些缺失的内存空间,但我在这里释放内存不是吗?仍然在512次调用该方法后,我的应用崩溃了。
如果需要的话我可以为您提供Logcat
但它是一个相当长的一个。经过一番调查,我很确定这个错误出现在内存分配/释放过程中(即,无论我调用函数多少次,注释掉两个GetDoubleArrayElements()
都会让我运行一个应用程序)。
感谢您的回答。无论如何,绝对有助于释放它们。所以从我读的内容以及如果我理解正确的话,一个好的方法是:if(isCopy1 == JNI_TRUE)env-> ReleaseDoubleArrayElements(rotation,rot,JNI_ABORT); } else { env-> ReleaseDoubleArrayElements(rotation,rot,0); } 如果(isCopy1 == JNI_TRUE){ env-> ReleaseDoubleArrayElements(平移,反式,JNI_ABORT); } else { env-> ReleaseDoubleArrayElements(translation,trans,0); }“我对吗?如果我是你,你可能想把它添加到你的答案。无论如何,anser接受和upvoted的文档和建议。 – LBes
@LBes我会说,在这里检查isCopy没有意义,如果你看看源代码:http://androidxref.com/6.0.0_r1/xref/art/runtime/jni_internal.cc#ReleasePrimitiveArray,你会看到当isCopy == false时,此函数不是检查JNI_ABORT的模式,您还将看到,如果isCopy为false,则此函数在某些情况下执行以下方法:DecrementDisableMovingGC – marcinj
好的谢谢:) – LBes