我在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);
}
可能出现什么问题?