【问题标题】:Android NDK memory usageAndroid NDK 内存使用情况
【发布时间】:2016-03-02 11:39:14
【问题描述】:

我应该将我从相机接收到的每个 yuv 图像缓冲区逆时针旋转 90 度。我发现这个post 使用了java。此代码工作正常。 但是我尝试做一个本地方法,因为我想做一个具有相同逻辑但工作速度更快的方法。

JNIEXPORT jbyteArray JNICALL Java_com_ndk_example_utils_NativeUtils_rotateFrameBackward
      (JNIEnv *env, jobject obj, jbyteArray arr, jint w, jint h){

      jint arrSize = w*h*3/2;
      jbyte *data,*yuv;

      data = (*env)->GetByteArrayElements(env, arr, JNI_FALSE);

      yuv = (*env)->GetByteArrayElements(env, arr, JNI_FALSE);

      int x,y,i = 0;
      for(x = 0; x < w; x++){
        for(y = h-1;y >= 0;y--){
          yuv[i] = data[y*w+x];
          i++;
        }
      }

      i = arrSize - 1;
      for(x = w-1;x > 0;x=x-2)
      {
        for(y = 0;y < h/2;y++)
        {
          yuv[i] = data[(w*h)+(y*w)+x];
          i--;
          yuv[i] = data[(w*h)+(y*w)+(x-1)];
          i--;
        }
      }
      (*env)->ReleaseByteArrayElements(env, arr, yuv, JNI_ABORT);
      yuv = 0;
      data = 0;
      return arr;
    }

当我在我的 htc 816(v5.1) 上启动此方法时,它运行良好,但是当我在三星 S3(v4.3) 和联想 P-70(v4.4.2) 上启动该应用程序时,该应用程序崩溃了.在 Android Studio 的 Android 监视器选项卡中,我看到了 内存使用量一直在增加,直到我的应用程序崩溃。在我的 htc 中,我没有问题。有什么想法吗?

【问题讨论】:

    标签: android c memory-leaks android-ndk java-native-interface


    【解决方案1】:

    您使用datayuvarr 执行双重GetByteArrayElements,然后只释放yuv。您也不会检查是否使用最后一个参数制作了副本,您只需输入JNI_FALSE。你不应该那样做,你应该使用一个布尔参数来接收这个值,而不是试图告诉系统是否要复制。

    因此你应该在最后释放两个指针。

    此外,如果此代码有效,则意味着实际上已进行了复制,因为您正在从同一内存区域读取和写入,这会导致图像损坏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-11
      • 2012-10-18
      相关资源
      最近更新 更多