diff --git a/core/jni/android/graphics/GraphicBuffer.cpp b/core/jni/android/graphics/GraphicBuffer.cpp index 73e53c6f93a24..1017cba017056 100644 --- a/core/jni/android/graphics/GraphicBuffer.cpp +++ b/core/jni/android/graphics/GraphicBuffer.cpp @@ -18,6 +18,7 @@ #include "jni.h" #include "JNIHelp.h" +#include #include "android_os_Parcel.h" #include "GraphicBuffer.h" @@ -27,6 +28,8 @@ #include +#include + #include #include @@ -90,9 +93,15 @@ static struct { class GraphicBufferWrapper { public: explicit GraphicBufferWrapper(const sp& buffer): buffer(buffer) { + LOG_ALWAYS_FATAL_IF(buffer == nullptr, "creating a null GraphicBuffer"); + } + const sp& get() const { + return buffer; } - sp buffer; +private: + // make sure this is immutable + sp const buffer; }; // ---------------------------------------------------------------------------- @@ -102,6 +111,8 @@ public: static jlong android_graphics_GraphicBuffer_wrap(JNIEnv* env, jobject clazz, jlong unwrapped) { sp b(reinterpret_cast(unwrapped)); + LOG_ALWAYS_FATAL_IF(b == nullptr, + "*** android_graphics_GraphicBuffer_wrap() invalid state, b is null, unwrapped=%#" PRIx64, unwrapped); GraphicBufferWrapper* wrapper = new GraphicBufferWrapper(b); return reinterpret_cast(wrapper); } @@ -159,7 +170,7 @@ static jboolean android_graphics_GraphicBuffer_lockCanvas(JNIEnv* env, jobject, return JNI_FALSE; } - sp buffer(wrapper->buffer); + sp buffer(wrapper->get()); Rect rect(Rect::EMPTY_RECT); if (dirtyRect) { @@ -217,7 +228,7 @@ static jboolean android_graphics_GraphicBuffer_unlockCanvasAndPost(JNIEnv* env, nativeCanvas->setBitmap(SkBitmap()); if (wrapper) { - status_t status = wrapper->buffer->unlock(); + status_t status = wrapper->get()->unlock(); return status == 0 ? JNI_TRUE : JNI_FALSE; } @@ -230,11 +241,12 @@ static jboolean android_graphics_GraphicBuffer_unlockCanvasAndPost(JNIEnv* env, static void android_graphics_GraphicBuffer_write(JNIEnv* env, jobject clazz, jlong wrapperHandle, jobject dest) { + GraphicBufferWrapper* wrapper = reinterpret_cast(wrapperHandle); Parcel* parcel = parcelForJavaObject(env, dest); if (parcel) { - parcel->write(*wrapper->buffer); + parcel->write(*wrapper->get()); } } @@ -260,7 +272,7 @@ sp graphicBufferForJavaObject(JNIEnv* env, jobject obj) { jlong nativeObject = env->GetLongField(obj, gGraphicBufferClassInfo.mNativeObject); GraphicBufferWrapper* wrapper = (GraphicBufferWrapper*) nativeObject; if (wrapper != NULL) { - sp buffer(wrapper->buffer); + sp buffer(wrapper->get()); return buffer; } } @@ -271,7 +283,7 @@ jobject createJavaGraphicBuffer(JNIEnv* env, const sp& buffer) { GraphicBufferWrapper* wrapper = new GraphicBufferWrapper(buffer); jobject obj = env->NewObject(gGraphicBufferClassInfo.mClass, gGraphicBufferClassInfo.mConstructorMethodID, buffer->getWidth(), buffer->getHeight(), - buffer->getPixelFormat(), buffer->getUsage(), reinterpret_cast(wrapper)); + buffer->getPixelFormat(), (jint)buffer->getUsage(), reinterpret_cast(wrapper)); return obj; } diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 8b82314476430..497f00c9d5a24 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -166,7 +166,7 @@ static jobject nativeScreenshotToBuffer(JNIEnv* env, jclass clazz, buffer->getWidth(), buffer->getHeight(), buffer->getPixelFormat(), - buffer->getUsage(), + (jint)buffer->getUsage(), (jlong)buffer.get()); }