diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp index bea2b8c53e2fd..2bde9911da8e8 100755 --- a/core/jni/android/graphics/Bitmap.cpp +++ b/core/jni/android/graphics/Bitmap.cpp @@ -1292,7 +1292,7 @@ static jint Bitmap_getAllocationByteCount(JNIEnv* env, jobject, jlong bitmapPtr) return static_cast(bitmapHandle->getAllocationByteCount()); } -static jobject Bitmap_nativeCopyPreserveInternalConfig(JNIEnv* env, jobject, jlong bitmapPtr) { +static jobject Bitmap_copyPreserveInternalConfig(JNIEnv* env, jobject, jlong bitmapPtr) { LocalScopedBitmap bitmapHandle(bitmapPtr); LOG_ALWAYS_FATAL_IF(!bitmapHandle->isHardware(), "Hardware config is only supported config in Bitmap_nativeCopyPreserveInternalConfig"); @@ -1319,6 +1319,16 @@ static jobject Bitmap_createHardwareBitmap(JNIEnv* env, jobject, jobject graphic return bitmap::createBitmap(env, bitmap.release(), android::bitmap::kBitmapCreateFlag_None); } +static jobject Bitmap_createGraphicBufferHandle(JNIEnv* env, jobject, jlong bitmapPtr) { + LocalScopedBitmap bitmapHandle(bitmapPtr); + LOG_ALWAYS_FATAL_IF(!bitmapHandle->isHardware(), + "Hardware config is only supported config in Bitmap_getGraphicBuffer"); + + Bitmap& hwuiBitmap = bitmapHandle->bitmap(); + sp buffer(hwuiBitmap.graphicBuffer()); + return createJavaGraphicBuffer(env, buffer); +} + /////////////////////////////////////////////////////////////////////////////// static jclass make_globalref(JNIEnv* env, const char classname[]) { @@ -1378,9 +1388,11 @@ static const JNINativeMethod gBitmapMethods[] = { { "nativePrepareToDraw", "(J)V", (void*)Bitmap_prepareToDraw }, { "nativeGetAllocationByteCount", "(J)I", (void*)Bitmap_getAllocationByteCount }, { "nativeCopyPreserveInternalConfig", "(J)Landroid/graphics/Bitmap;", - (void*)Bitmap_nativeCopyPreserveInternalConfig }, + (void*)Bitmap_copyPreserveInternalConfig }, { "nativeCreateHardwareBitmap", "(Landroid/graphics/GraphicBuffer;)Landroid/graphics/Bitmap;", - (void*) Bitmap_createHardwareBitmap } + (void*) Bitmap_createHardwareBitmap }, + { "nativeCreateGraphicBufferHandle", "(J)Landroid/graphics/GraphicBuffer;", + (void*) Bitmap_createGraphicBufferHandle } }; int register_android_graphics_Bitmap(JNIEnv* env) diff --git a/core/jni/android/graphics/GraphicBuffer.cpp b/core/jni/android/graphics/GraphicBuffer.cpp index 6cc7109640501..c61b53e5fa655 100644 --- a/core/jni/android/graphics/GraphicBuffer.cpp +++ b/core/jni/android/graphics/GraphicBuffer.cpp @@ -58,6 +58,8 @@ static const bool kDebugGraphicBuffer = false; static struct { jfieldID mNativeObject; + jclass mClass; + jmethodID mConstructorMethodID; } gGraphicBufferClassInfo; static struct { @@ -266,6 +268,15 @@ sp graphicBufferForJavaObject(JNIEnv* env, jobject obj) { } return NULL; } + +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)); + return obj; +} + }; using namespace android; @@ -291,10 +302,13 @@ static const JNINativeMethod gMethods[] = { }; int register_android_graphics_GraphicBuffer(JNIEnv* env) { - jclass clazz = FindClassOrDie(env, "android/graphics/GraphicBuffer"); - gGraphicBufferClassInfo.mNativeObject = GetFieldIDOrDie(env, clazz, "mNativeObject", "J"); + gGraphicBufferClassInfo.mClass = MakeGlobalRefOrDie(env, FindClassOrDie(env, kClassPathName)); + gGraphicBufferClassInfo.mNativeObject = GetFieldIDOrDie(env, gGraphicBufferClassInfo.mClass, + "mNativeObject", "J"); + gGraphicBufferClassInfo.mConstructorMethodID = env->GetMethodID(gGraphicBufferClassInfo.mClass, + "", "(IIIIJ)V"); - clazz = FindClassOrDie(env, "android/graphics/Rect"); + jclass clazz = FindClassOrDie(env, "android/graphics/Rect"); gRectClassInfo.set = GetMethodIDOrDie(env, clazz, "set", "(IIII)V"); gRectClassInfo.left = GetFieldIDOrDie(env, clazz, "left", "I"); gRectClassInfo.top = GetFieldIDOrDie(env, clazz, "top", "I"); diff --git a/core/jni/android/graphics/GraphicBuffer.h b/core/jni/android/graphics/GraphicBuffer.h index 509587cc4e201..0d7266942748e 100644 --- a/core/jni/android/graphics/GraphicBuffer.h +++ b/core/jni/android/graphics/GraphicBuffer.h @@ -24,4 +24,6 @@ namespace android { // object must be an instance of android.view.GraphicBuffer extern sp graphicBufferForJavaObject(JNIEnv* env, jobject obj); +jobject createJavaGraphicBuffer(JNIEnv* env, const sp& buffer); + } diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java index f58ff675d63b2..ba7f05d86fc8b 100644 --- a/graphics/java/android/graphics/Bitmap.java +++ b/graphics/java/android/graphics/Bitmap.java @@ -1746,6 +1746,15 @@ public final class Bitmap implements Parcelable { nativePrepareToDraw(mNativePtr); } + /** + * + * @return {@link GraphicBuffer} which is internally used by hardware bitmap + * @hide + */ + public GraphicBuffer createGraphicBufferHandle() { + return nativeCreateGraphicBufferHandle(mNativePtr); + } + //////////// native methods private static native Bitmap nativeCreate(int[] colors, int offset, @@ -1806,4 +1815,5 @@ public final class Bitmap implements Parcelable { private static native int nativeGetAllocationByteCount(long nativeBitmap); private static native Bitmap nativeCopyPreserveInternalConfig(long nativeBitmap); private static native Bitmap nativeCreateHardwareBitmap(GraphicBuffer buffer); + private static native GraphicBuffer nativeCreateGraphicBufferHandle(long nativeBitmap); }