重复调用JNI方法会使应用程序崩溃

时间:2015-11-20 12:52:21

标签: android memory-management android-ndk java-native-interface

所以我注意到在重复调用以下方法后我的应用程序崩溃了。

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()注释掉一个正在运行的应用程序。)< / p>

1 个答案:

答案 0 :(得分:1)

在android文档中:http://developer.android.com/training/articles/perf-jni.html

明确说明:

  

您必须释放您获得的每个阵列。此外,如果Get调用失败,则必须确保您的代码稍后不会尝试释放NULL指针。

数字512是我记得您的代码超出的本地引用数量的限制。因此,您应该删除这些支票:if(isCopy2 == JNI_TRUE){

仍然,上面的文档有一个关于JNI_ABORT的段落,它解释了它可能与isCopy一起使用 - 但它有点令人困惑。你可以搜索android源码如何使用JNI_ABORT,即这里有一些代码:

http://androidxref.com/6.0.0_r1/xref/frameworks/ml/bordeaux/learning/multiclass_pa/jni/jni_multiclass_pa.cpp#77

在我的代码中,我经常使用PushLocalFrame / PopLocalFrame来防止本地引用泄漏。