11a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner/* 21a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner * Copyright (C) 2017 The Android Open Source Project 31a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner * 41a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner * Licensed under the Apache License, Version 2.0 (the "License"); 51a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner * you may not use this file except in compliance with the License. 61a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner * You may obtain a copy of the License at 71a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner * 81a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner * http://www.apache.org/licenses/LICENSE-2.0 91a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner * 101a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner * Unless required by applicable law or agreed to in writing, software 111a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner * distributed under the License is distributed on an "AS IS" BASIS, 121a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner * See the License for the specific language governing permissions and 141a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner * limitations under the License. 151a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner */ 161a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 171a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner#define LOG_TAG "HardwareBuffer" 181a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 191a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner#include "jni.h" 201a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner#include "JNIHelp.h" 211a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 221a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner#include "android_os_Parcel.h" 231a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner#include "android/graphics/GraphicsJNI.h" 241a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 251a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner#include <android/hardware_buffer.h> 261a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner#include <android_runtime/android_hardware_HardwareBuffer.h> 271a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner#include <android_runtime/AndroidRuntime.h> 281a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner#include <android_runtime/Log.h> 29fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian#include <private/android/AHardwareBufferHelpers.h> 301a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 311a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner#include <binder/Parcel.h> 32fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian 33fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian#include <ui/GraphicBuffer.h> 341a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner#include <private/gui/ComposerService.h> 351a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 36fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian#include <hardware/gralloc1.h> 37f2c44a37352a4da6e8266cdf460b2c80b06bc294Chris Forbes#include <grallocusage/GrallocUsageConversion.h> 38fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian 391a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner#include "core_jni_helpers.h" 401a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 411a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerusing namespace android; 421a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 431a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// ---------------------------------------------------------------------------- 441a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// Defines 451a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// ---------------------------------------------------------------------------- 461a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 471a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// Debug 483027095761a0feaf72259eb0086590717aed8b13Craig Donnerstatic constexpr bool kDebugGraphicBuffer = false; 491a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 501a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// ---------------------------------------------------------------------------- 511a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// Types 521a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// ---------------------------------------------------------------------------- 531a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 541a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerstatic struct { 551a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner jclass clazz; 561a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner jfieldID mNativeObject; 571a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner jmethodID ctor; 581a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner} gHardwareBufferClassInfo; 591a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 601a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerclass GraphicBufferWrapper { 611a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerpublic: 621a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner explicit GraphicBufferWrapper(const sp<GraphicBuffer>& buffer) 631a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner : buffer(buffer) {} 641a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 651a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner sp<GraphicBuffer> buffer; 661a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner}; 671a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 681a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// ---------------------------------------------------------------------------- 691a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// HardwareBuffer lifecycle 701a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// ---------------------------------------------------------------------------- 711a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 721a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerstatic jlong android_hardware_HardwareBuffer_create(JNIEnv* env, jobject clazz, 731a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner jint width, jint height, jint format, jint layers, jlong usage) { 741a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 751a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner // TODO: update createGraphicBuffer to take two 64-bit values. 761a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner int pixelFormat = android_hardware_HardwareBuffer_convertToPixelFormat(format); 771a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner if (pixelFormat == 0) { 781a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner if (kDebugGraphicBuffer) { 791a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner ALOGW("createGraphicBufferAlloc() invalid pixel format in HardwareBuffer.create()"); 801a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner } 811a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner return NULL; 821a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner } 832bd7d98fe844ebd6632a55eee9abf6d18651caf5Mathias Agopian 84910ab13e6639fa71b8004f4f0920dadbd41400cdMathias Agopian uint64_t grallocUsage = AHardwareBuffer_convertToGrallocUsageBits(usage); 852bd7d98fe844ebd6632a55eee9abf6d18651caf5Mathias Agopian sp<GraphicBuffer> buffer = new GraphicBuffer(width, height, pixelFormat, layers, 86910ab13e6639fa71b8004f4f0920dadbd41400cdMathias Agopian grallocUsage, std::string("HardwareBuffer pid [") + std::to_string(getpid()) +"]"); 872bd7d98fe844ebd6632a55eee9abf6d18651caf5Mathias Agopian status_t error = buffer->initCheck(); 882bd7d98fe844ebd6632a55eee9abf6d18651caf5Mathias Agopian if (error < 0) { 891a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner if (kDebugGraphicBuffer) { 901a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner ALOGW("createGraphicBuffer() failed in HardwareBuffer.create()"); 911a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner } 921a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner return NULL; 931a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner } 941a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 951a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner GraphicBufferWrapper* wrapper = new GraphicBufferWrapper(buffer); 961a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner return reinterpret_cast<jlong>(wrapper); 971a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner} 981a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 991a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerstatic void destroyWrapper(GraphicBufferWrapper* wrapper) { 1001a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner delete wrapper; 1011a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner} 1021a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 103fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopianstatic jlong android_hardware_HardwareBuffer_getNativeFinalizer(JNIEnv* env, jobject clazz) { 1041a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner return static_cast<jlong>(reinterpret_cast<uintptr_t>(&destroyWrapper)); 1051a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner} 1061a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 1071a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner//---------------------------------------------------------------------------- 1081a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// Accessors 1091a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// ---------------------------------------------------------------------------- 1101a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 1111a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerstatic inline GraphicBuffer* GraphicBufferWrapper_to_GraphicBuffer( 1121a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner jlong nativeObject) { 1131a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner return reinterpret_cast<GraphicBufferWrapper*>(nativeObject)->buffer.get(); 1141a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner} 1151a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 1161a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerstatic jint android_hardware_HardwareBuffer_getWidth(JNIEnv* env, jobject clazz, 1171a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner jlong nativeObject) { 1181a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner GraphicBuffer* buffer = GraphicBufferWrapper_to_GraphicBuffer(nativeObject); 1191a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner return static_cast<jint>(buffer->getWidth()); 1201a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner} 1211a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 1221a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerstatic jint android_hardware_HardwareBuffer_getHeight(JNIEnv* env, 1231a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner jobject clazz, jlong nativeObject) { 1241a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner GraphicBuffer* buffer = GraphicBufferWrapper_to_GraphicBuffer(nativeObject); 1251a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner return static_cast<jint>(buffer->getHeight()); 1261a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner} 1271a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 1281a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerstatic jint android_hardware_HardwareBuffer_getFormat(JNIEnv* env, 1291a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner jobject clazz, jlong nativeObject) { 1301a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner GraphicBuffer* buffer = GraphicBufferWrapper_to_GraphicBuffer(nativeObject); 1311a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner return static_cast<jint>(android_hardware_HardwareBuffer_convertFromPixelFormat( 1321a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner buffer->getPixelFormat())); 1331a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner} 1341a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 1351a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerstatic jint android_hardware_HardwareBuffer_getLayers(JNIEnv* env, 1361a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner jobject clazz, jlong nativeObject) { 1371a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner GraphicBuffer* buffer = GraphicBufferWrapper_to_GraphicBuffer(nativeObject); 1381a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner return static_cast<jint>(buffer->getLayerCount()); 1391a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner} 1401a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 1411a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerstatic jlong android_hardware_HardwareBuffer_getUsage(JNIEnv* env, 1421a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner jobject clazz, jlong nativeObject) { 1431a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner GraphicBuffer* buffer = GraphicBufferWrapper_to_GraphicBuffer(nativeObject); 144910ab13e6639fa71b8004f4f0920dadbd41400cdMathias Agopian return AHardwareBuffer_convertFromGrallocUsageBits(buffer->getUsage()); 1451a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner} 1461a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 1471a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// ---------------------------------------------------------------------------- 1481a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// Serialization 1491a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// ---------------------------------------------------------------------------- 1501a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 1511a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerstatic void android_hardware_HardwareBuffer_write(JNIEnv* env, jobject clazz, 1521a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner jlong nativeObject, jobject dest) { 1531a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner GraphicBuffer* buffer = GraphicBufferWrapper_to_GraphicBuffer(nativeObject); 1541a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner Parcel* parcel = parcelForJavaObject(env, dest); 1551a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner if (parcel) { 1561a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner parcel->write(*buffer); 1571a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner } 1581a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner} 1591a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 1601a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerstatic jlong android_hardware_HardwareBuffer_read(JNIEnv* env, jobject clazz, 1611a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner jobject in) { 1621a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner Parcel* parcel = parcelForJavaObject(env, in); 1631a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner if (parcel) { 1641a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner sp<GraphicBuffer> buffer = new GraphicBuffer(); 1651a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner parcel->read(*buffer); 1661a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner return reinterpret_cast<jlong>(new GraphicBufferWrapper(buffer)); 1671a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner } 1681a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 1691a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner return NULL; 1701a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner} 1711a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 1721a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// ---------------------------------------------------------------------------- 1731a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// Public functions 1741a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// ---------------------------------------------------------------------------- 1751a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 1761a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnernamespace android { 1771a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 1781a4d07d9193f843ebf4403ef49bac4cd61d34165Craig DonnerAHardwareBuffer* android_hardware_HardwareBuffer_getNativeHardwareBuffer( 1791a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner JNIEnv* env, jobject hardwareBufferObj) { 1801a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner if (env->IsInstanceOf(hardwareBufferObj, gHardwareBufferClassInfo.clazz)) { 1811a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner GraphicBuffer* buffer = GraphicBufferWrapper_to_GraphicBuffer( 1821a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner env->GetLongField(hardwareBufferObj, gHardwareBufferClassInfo.mNativeObject)); 183fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian return AHardwareBuffer_from_GraphicBuffer(buffer); 184fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian 1851a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner } else { 1861a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner return nullptr; 1871a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner } 1881a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner} 1891a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 1901a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerjobject android_hardware_HardwareBuffer_createFromAHardwareBuffer( 1911a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner JNIEnv* env, AHardwareBuffer* hardwareBuffer) { 192fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian GraphicBuffer* buffer = AHardwareBuffer_to_GraphicBuffer(hardwareBuffer); 1931a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner GraphicBufferWrapper* wrapper = new GraphicBufferWrapper(buffer); 1941a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner jobject hardwareBufferObj = env->NewObject(gHardwareBufferClassInfo.clazz, 1951a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner gHardwareBufferClassInfo.ctor, reinterpret_cast<jlong>(wrapper)); 1961a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner if (hardwareBufferObj == NULL) { 1971a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner delete wrapper; 1981a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner if (env->ExceptionCheck()) { 1991a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner ALOGE("Could not create instance of HardwareBuffer from AHardwareBuffer."); 2001a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner LOGE_EX(env); 2011a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner env->ExceptionClear(); 2021a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner } 2031a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner return nullptr; 2041a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner } 2051a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner return hardwareBufferObj; 2061a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner} 2071a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 2081a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donneruint32_t android_hardware_HardwareBuffer_convertFromPixelFormat(uint32_t format) { 209fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian return AHardwareBuffer_convertFromPixelFormat(format); 2101a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner} 2111a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 2121a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donneruint32_t android_hardware_HardwareBuffer_convertToPixelFormat(uint32_t format) { 213fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian return AHardwareBuffer_convertToPixelFormat(format); 2141a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner} 2151a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 216910ab13e6639fa71b8004f4f0920dadbd41400cdMathias Agopianuint64_t android_hardware_HardwareBuffer_convertToGrallocUsageBits(uint64_t usage) { 217910ab13e6639fa71b8004f4f0920dadbd41400cdMathias Agopian return AHardwareBuffer_convertToGrallocUsageBits(usage); 2181a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner} 2191a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 2201a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner} // namespace android 2211a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 2221a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// ---------------------------------------------------------------------------- 2231a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// JNI Glue 2241a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// ---------------------------------------------------------------------------- 2251a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 2261a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerconst char* const kClassPathName = "android/hardware/HardwareBuffer"; 2271a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 2281a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerstatic const JNINativeMethod gMethods[] = { 229fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian { "nCreateHardwareBuffer", "(IIIIJ)J", 230fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian (void*) android_hardware_HardwareBuffer_create }, 231fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian { "nGetNativeFinalizer", "()J", 232fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian (void*) android_hardware_HardwareBuffer_getNativeFinalizer }, 2331a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner { "nWriteHardwareBufferToParcel", "(JLandroid/os/Parcel;)V", 2341a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner (void*) android_hardware_HardwareBuffer_write }, 2351a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner { "nReadHardwareBufferFromParcel", "(Landroid/os/Parcel;)J", 2361a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner (void*) android_hardware_HardwareBuffer_read }, 2371a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 2381a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner // --------------- @FastNative ---------------------- 239fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian { "nGetWidth", "(J)I", (void*) android_hardware_HardwareBuffer_getWidth }, 240fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian { "nGetHeight", "(J)I", (void*) android_hardware_HardwareBuffer_getHeight }, 241fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian { "nGetFormat", "(J)I", (void*) android_hardware_HardwareBuffer_getFormat }, 242fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian { "nGetLayers", "(J)I", (void*) android_hardware_HardwareBuffer_getLayers }, 243fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian { "nGetUsage", "(J)J", (void*) android_hardware_HardwareBuffer_getUsage }, 2441a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner}; 2451a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 2461a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerint register_android_hardware_HardwareBuffer(JNIEnv* env) { 2471a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner int err = RegisterMethodsOrDie(env, kClassPathName, gMethods, 2481a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner NELEM(gMethods)); 2491a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 2501a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner jclass clazz = FindClassOrDie(env, "android/hardware/HardwareBuffer"); 2511a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner gHardwareBufferClassInfo.clazz = MakeGlobalRefOrDie(env, clazz); 2521a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner gHardwareBufferClassInfo.mNativeObject = GetFieldIDOrDie(env, 2531a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner gHardwareBufferClassInfo.clazz, "mNativeObject", "J"); 2541a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner gHardwareBufferClassInfo.ctor = GetMethodIDOrDie(env, 2551a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner gHardwareBufferClassInfo.clazz, "<init>", "(J)V"); 2561a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner 2571a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner return err; 2581a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner} 259