AndroidBitmap_lockPixels因ANDROID_BITMAP_RESULT_ALLOCATION_FAILED而失败

时间:2016-02-27 15:31:12

标签: android opengl-es bitmap bytebuffer

我在Android中拥有自己的getByteBuffer原生实现,因此我可以获得位图数组的包装,以便向OpenGL发送正确的指针。这个实现工作正常,但在一些随机的情况下和随机时间,我无法锁定位图像素失败。我进行了调试,发现错误来自ANDROID_BITMAP_RESULT_ALLOCATION_FAILED中的AndroidBitmap_lockPixels

以下是我将指针发送到OpenGL的方法:

for (int i = 0; i < 6; i++) {
      GLES20.glTexImage2D(
          GLES20.GL_TEXTURE_CUBE_MAP_POSITIVE_X + i,
          0,
          COLOR_FORMAT,
          sideLength,
          sideLength,
          0,
          COLOR_FORMAT,
          GLES20.GL_UNSIGNED_BYTE,
          Bitmaps.getByteBuffer(mBitmap, (bitmapByteCount / 6) * i, bitmapByteCount / 6));
    }

这是我getByteBuffer的原生实现:

static jobject Bitmaps_getByteBuffer(
  JNIEnv* env,
  jclass clazz,
  jobject bitmap,
  jlong offset,
  jlong size) {
  UNUSED(clazz);
  void* pixelPtr;
  AndroidBitmapInfo bitmapInfo;

  int rc = AndroidBitmap_getInfo(env, bitmap, &bitmapInfo);
  if (rc != ANDROID_BITMAP_RESULT_SUCCESS) {
    safe_throw_exception(env, "Failed to get Bitmap info");
    return NULL;
  }

  if (bitmapInfo.format != ANDROID_BITMAP_FORMAT_RGBA_8888) {
    safe_throw_exception(env, "Unexpected bitmap format");
    return NULL;
  }

  jlong arrayLength = bitmapInfo.width * bitmapInfo.height * 4;
  if (offset < 0 || size < 0 || offset > arrayLength || arrayLength - offset < size) {
    safe_throw_exception(env, "Index out of bounds");
    return NULL;
  }

  rc = AndroidBitmap_lockPixels(env, bitmap, &pixelPtr);
  if (rc != ANDROID_BITMAP_RESULT_SUCCESS) {
    safe_throw_exception(env, "Failed to lock Bitmap pixels");
    return NULL;
  }

  pixelPtr = (void*) ((uint8_t*) pixelPtr + offset);
  return (*env)->NewDirectByteBuffer(env, pixelPtr, size);
}

可能出现什么问题?

0 个答案:

没有答案