android_view_TextureView.cpp revision 76f6a86de25e1bf74717e047e55fd44b089673f3
18f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy/*
28f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy * Copyright (C) 2011 The Android Open Source Project
38f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy *
48f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy * Licensed under the Apache License, Version 2.0 (the "License");
58f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy * you may not use this file except in compliance with the License.
68f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy * You may obtain a copy of the License at
78f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy *
88f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy *      http://www.apache.org/licenses/LICENSE-2.0
98f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy *
108f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy * Unless required by applicable law or agreed to in writing, software
118f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy * distributed under the License is distributed on an "AS IS" BASIS,
128f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy * See the License for the specific language governing permissions and
148f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy * limitations under the License.
158f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy */
168f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy
178f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy#include "jni.h"
188f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy#include <nativehelper/JNIHelp.h>
198f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy#include <android_runtime/AndroidRuntime.h>
20035f1010ebed7d420e74a4e9d830018ab8c8163aRomain Guy#include <android_runtime/android_graphics_SurfaceTexture.h>
218f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy
226be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy#include <ui/Region.h>
236be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy#include <ui/Rect.h>
246be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
25d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden#include <gui/GLConsumer.h>
2652800617946c456e78ed010c82d0ec4358368164Mathias Agopian#include <gui/Surface.h>
276be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
286be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy#include <SkBitmap.h>
296be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy#include <SkCanvas.h>
308790be6de3644e332ec6a17c855da89ffc13a9bfLeon Scroggins III#include <SkImage.h>
318f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy
325c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita#include "android/graphics/GraphicsJNI.h"
335c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita
34987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe#include "core_jni_helpers.h"
35987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
368f0095cd33558e9cc8a440047908e53b68906f5fRomain Guynamespace android {
378f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy
388f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy// ----------------------------------------------------------------------------
396be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy// JNI Glue
406be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy// ----------------------------------------------------------------------------
416be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
426be3d5561cbeccf0a8257a4acb155657f868e548Romain Guystatic struct {
436be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    jmethodID set;
446be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    jfieldID left;
456be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    jfieldID top;
466be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    jfieldID right;
476be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    jfieldID bottom;
486be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy} gRectClassInfo;
496be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
506be3d5561cbeccf0a8257a4acb155657f868e548Romain Guystatic struct {
51fc615a0f643408956fc0dc1b997871e2b27cee7eDerek Sollenberger    jfieldID mSurfaceFormat;
525c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita    jmethodID setNativeBitmap;
536be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy} gCanvasClassInfo;
546be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
556be3d5561cbeccf0a8257a4acb155657f868e548Romain Guystatic struct {
566be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    jfieldID nativeWindow;
576be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy} gTextureViewClassInfo;
586be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
596be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy#define GET_INT(object, field) \
606be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    env->GetIntField(object, field)
616be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
6236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat#define GET_LONG(object, field) \
6336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    env->GetLongField(object, field)
6436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
656be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy#define SET_INT(object, field, value) \
666be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    env->SetIntField(object, field, value)
676be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
6836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat#define SET_LONG(object, field, value) \
6936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    env->SetLongField(object, field, value)
7036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
716be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy#define INVOKEV(object, method, ...) \
726be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    env->CallVoidMethod(object, method, __VA_ARGS__)
736be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
746be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy// ----------------------------------------------------------------------------
758f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy// Native layer
768f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy// ----------------------------------------------------------------------------
778f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy
78b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed// FIXME: consider exporting this to share (e.g. android_view_Surface.cpp)
79b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reedstatic inline SkImageInfo convertPixelFormat(const ANativeWindow_Buffer& buffer) {
80b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed    SkImageInfo info;
81b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed    info.fWidth = buffer.width;
82b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed    info.fHeight = buffer.height;
83b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed    switch (buffer.format) {
846be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy        case WINDOW_FORMAT_RGBA_8888:
85b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed            info.fColorType = kN32_SkColorType;
86b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed            info.fAlphaType = kPremul_SkAlphaType;
87b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed            break;
886be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy        case WINDOW_FORMAT_RGBX_8888:
89b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed            info.fColorType = kN32_SkColorType;
90b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed            info.fAlphaType = kOpaque_SkAlphaType;
916be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy        case WINDOW_FORMAT_RGB_565:
92b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed            info.fColorType = kRGB_565_SkColorType;
93b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed            info.fAlphaType = kOpaque_SkAlphaType;
946be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy        default:
95b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed            info.fColorType = kUnknown_SkColorType;
96b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed            info.fAlphaType = kIgnore_SkAlphaType;
97b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed            break;
986be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    }
99b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed    return info;
1006be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy}
1016be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
1026be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy/**
1036be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy * This is a private API, and this implementation is also provided in the NDK.
1046be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy * However, the NDK links against android_runtime, which means that using the
1056be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy * NDK implementation would create a circular dependency between the libraries.
1066be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy */
1076be3d5561cbeccf0a8257a4acb155657f868e548Romain Guystatic int32_t native_window_lock(ANativeWindow* window, ANativeWindow_Buffer* outBuffer,
1086be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy        Rect* inOutDirtyBounds) {
1096be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    return window->perform(window, NATIVE_WINDOW_LOCK, outBuffer, inOutDirtyBounds);
1106be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy}
1116be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
1126be3d5561cbeccf0a8257a4acb155657f868e548Romain Guystatic int32_t native_window_unlockAndPost(ANativeWindow* window) {
1136be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    return window->perform(window, NATIVE_WINDOW_UNLOCK_AND_POST);
1146be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy}
1156be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
1166be3d5561cbeccf0a8257a4acb155657f868e548Romain Guystatic void android_view_TextureView_createNativeWindow(JNIEnv* env, jobject textureView,
1176be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy        jobject surface) {
1186be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
11952a9a10b6b8c7b7a9f97777541841b94d4fd9754Mathias Agopian    sp<IGraphicBufferProducer> producer(SurfaceTexture_getProducer(env, surface));
12024f43c9d2c9c81bfdeeec0c201703cccfba14c51Mathias Agopian    sp<ANativeWindow> window = new Surface(producer, true);
1216be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
122b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian    window->incStrong((void*)android_view_TextureView_createNativeWindow);
12336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    SET_LONG(textureView, gTextureViewClassInfo.nativeWindow, jlong(window.get()));
1246be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy}
1256be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
1266be3d5561cbeccf0a8257a4acb155657f868e548Romain Guystatic void android_view_TextureView_destroyNativeWindow(JNIEnv* env, jobject textureView) {
1276be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
1286be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    ANativeWindow* nativeWindow = (ANativeWindow*)
12936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat            GET_LONG(textureView, gTextureViewClassInfo.nativeWindow);
1306be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
1316be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    if (nativeWindow) {
1326be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy        sp<ANativeWindow> window(nativeWindow);
133b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian            window->decStrong((void*)android_view_TextureView_createNativeWindow);
13436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SET_LONG(textureView, gTextureViewClassInfo.nativeWindow, 0);
1356be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    }
1366be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy}
1376be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
13853bacf5a91a760f6c0a966ed2f50a25e7fe12aebRomain Guystatic jboolean android_view_TextureView_lockCanvas(JNIEnv* env, jobject,
13936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong nativeWindow, jobject canvas, jobject dirtyRect) {
1406be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
1416be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    if (!nativeWindow) {
14236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return JNI_FALSE;
1436be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    }
1446be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
1456be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    ANativeWindow_Buffer buffer;
1466be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
1476be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    Rect rect;
1486be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    if (dirtyRect) {
1496be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy        rect.left = GET_INT(dirtyRect, gRectClassInfo.left);
1506be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy        rect.top = GET_INT(dirtyRect, gRectClassInfo.top);
1516be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy        rect.right = GET_INT(dirtyRect, gRectClassInfo.right);
1526be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy        rect.bottom = GET_INT(dirtyRect, gRectClassInfo.bottom);
1536be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    } else {
1546be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy        rect.set(Rect(0x3FFF, 0x3FFF));
1556be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    }
1566be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
1576be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    sp<ANativeWindow> window((ANativeWindow*) nativeWindow);
15853bacf5a91a760f6c0a966ed2f50a25e7fe12aebRomain Guy    int32_t status = native_window_lock(window.get(), &buffer, &rect);
15936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    if (status) return JNI_FALSE;
1606be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
1616be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    ssize_t bytesCount = buffer.stride * bytesPerPixel(buffer.format);
1626be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
1636be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    SkBitmap bitmap;
164b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed    bitmap.setInfo(convertPixelFormat(buffer), bytesCount);
1656be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
1666be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    if (buffer.width > 0 && buffer.height > 0) {
1676be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy        bitmap.setPixels(buffer.bits);
1686be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    } else {
1696be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy        bitmap.setPixels(NULL);
1706be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    }
1716be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
172fc615a0f643408956fc0dc1b997871e2b27cee7eDerek Sollenberger    SET_INT(canvas, gCanvasClassInfo.mSurfaceFormat, buffer.format);
1735c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita    INVOKEV(canvas, gCanvasClassInfo.setNativeBitmap, reinterpret_cast<jlong>(&bitmap));
1746be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
1756be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    SkRect clipRect;
1766be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    clipRect.set(rect.left, rect.top, rect.right, rect.bottom);
1775c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita    SkCanvas* nativeCanvas = GraphicsJNI::getNativeCanvas(env, canvas);
1786be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    nativeCanvas->clipRect(clipRect);
1796be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
1806be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    if (dirtyRect) {
1816be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy        INVOKEV(dirtyRect, gRectClassInfo.set,
1826be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy                int(rect.left), int(rect.top), int(rect.right), int(rect.bottom));
1836be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    }
18453bacf5a91a760f6c0a966ed2f50a25e7fe12aebRomain Guy
18536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return JNI_TRUE;
1866be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy}
1876be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
1886be3d5561cbeccf0a8257a4acb155657f868e548Romain Guystatic void android_view_TextureView_unlockCanvasAndPost(JNIEnv* env, jobject,
18936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        jlong nativeWindow, jobject canvas) {
1906be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
1915c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita    INVOKEV(canvas, gCanvasClassInfo.setNativeBitmap, (jlong)0);
1926be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
1936be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    if (nativeWindow) {
1946be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy        sp<ANativeWindow> window((ANativeWindow*) nativeWindow);
1956be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy        native_window_unlockAndPost(window.get());
1966be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    }
1976be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy}
1986be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
1998f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy// ----------------------------------------------------------------------------
2008f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy// JNI Glue
2018f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy// ----------------------------------------------------------------------------
2028f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy
2038f0095cd33558e9cc8a440047908e53b68906f5fRomain Guyconst char* const kClassPathName = "android/view/TextureView";
2048f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy
20576f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMethods[] = {
2066be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    {   "nCreateNativeWindow", "(Landroid/graphics/SurfaceTexture;)V",
2076be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy            (void*) android_view_TextureView_createNativeWindow },
2086be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    {   "nDestroyNativeWindow", "()V",
2096be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy            (void*) android_view_TextureView_destroyNativeWindow },
2106be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
21136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {   "nLockCanvas", "(JLandroid/graphics/Canvas;Landroid/graphics/Rect;)Z",
2126be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy            (void*) android_view_TextureView_lockCanvas },
21336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {   "nUnlockCanvasAndPost", "(JLandroid/graphics/Canvas;)V",
2146be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy            (void*) android_view_TextureView_unlockCanvasAndPost },
2158f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy};
2168f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy
217987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampeint register_android_view_TextureView(JNIEnv* env) {
218987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    jclass clazz = FindClassOrDie(env, "android/graphics/Rect");
219987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gRectClassInfo.set = GetMethodIDOrDie(env, clazz, "set", "(IIII)V");
220987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gRectClassInfo.left = GetFieldIDOrDie(env, clazz, "left", "I");
221987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gRectClassInfo.top = GetFieldIDOrDie(env, clazz, "top", "I");
222987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gRectClassInfo.right = GetFieldIDOrDie(env, clazz, "right", "I");
223987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gRectClassInfo.bottom = GetFieldIDOrDie(env, clazz, "bottom", "I");
2246be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
225987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    clazz = FindClassOrDie(env, "android/graphics/Canvas");
226987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gCanvasClassInfo.mSurfaceFormat = GetFieldIDOrDie(env, clazz, "mSurfaceFormat", "I");
227987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gCanvasClassInfo.setNativeBitmap = GetMethodIDOrDie(env, clazz, "setNativeBitmap", "(J)V");
2286be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
229987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    clazz = FindClassOrDie(env, "android/view/TextureView");
230987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gTextureViewClassInfo.nativeWindow = GetFieldIDOrDie(env, clazz, "mNativeWindow", "J");
2316be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
232987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
2338f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy}
2348f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy
2358f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy};
236