blob: fa4d23cff77e935aa0989f04f5af139fea657c75 [file] [log] [blame]
Romain Guye4d01122010-06-16 18:44:05 -07001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Romain Guya1db5742010-07-20 13:09:13 -070017#define LOG_TAG "OpenGLRenderer"
18
Romain Guye4d01122010-06-16 18:44:05 -070019#include "jni.h"
20#include <nativehelper/JNIHelp.h>
21#include <android_runtime/AndroidRuntime.h>
Romain Guydeba7852010-07-07 17:54:48 -070022#include <utils/ResourceTypes.h>
Romain Guye4d01122010-06-16 18:44:05 -070023
Romain Guyce0537b2010-06-29 21:05:21 -070024#include <SkBitmap.h>
Romain Guyc7d53492010-06-25 13:41:57 -070025#include <SkCanvas.h>
Romain Guyf6a11b82010-06-23 17:47:49 -070026#include <SkMatrix.h>
Romain Guyc7d53492010-06-25 13:41:57 -070027#include <SkPaint.h>
Romain Guy079ba2c2010-07-16 14:12:24 -070028#include <SkRegion.h>
Romain Guya1db5742010-07-20 13:09:13 -070029#include <SkScalerContext.h>
Romain Guy85bf02f2010-06-22 13:11:24 -070030#include <SkXfermode.h>
Romain Guye4d01122010-06-16 18:44:05 -070031
Romain Guy85bf02f2010-06-22 13:11:24 -070032#include <OpenGLRenderer.h>
Romain Guy9d5316e2010-06-24 19:30:36 -070033#include <Rect.h>
34#include <ui/Rect.h>
Romain Guy85bf02f2010-06-22 13:11:24 -070035
Romain Guye4d01122010-06-16 18:44:05 -070036namespace android {
37
Romain Guy9d5316e2010-06-24 19:30:36 -070038using namespace uirenderer;
39
40// ----------------------------------------------------------------------------
41// Java APIs
42// ----------------------------------------------------------------------------
43
44static struct {
Romain Guy7ae7ac42010-06-25 13:46:18 -070045 jclass clazz;
46 jmethodID set;
Romain Guy9d5316e2010-06-24 19:30:36 -070047} gRectClassInfo;
48
Romain Guye4d01122010-06-16 18:44:05 -070049// ----------------------------------------------------------------------------
50// Constructors
51// ----------------------------------------------------------------------------
52
Romain Guyce0537b2010-06-29 21:05:21 -070053static OpenGLRenderer* android_view_GLES20Canvas_createRenderer(JNIEnv* env, jobject canvas) {
Romain Guy85bf02f2010-06-22 13:11:24 -070054 return new OpenGLRenderer;
Romain Guye4d01122010-06-16 18:44:05 -070055}
56
Romain Guyce0537b2010-06-29 21:05:21 -070057static void android_view_GLES20Canvas_destroyRenderer(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -070058 OpenGLRenderer* renderer) {
59 delete renderer;
Romain Guye4d01122010-06-16 18:44:05 -070060}
61
62// ----------------------------------------------------------------------------
63// Setup
64// ----------------------------------------------------------------------------
65
Romain Guyce0537b2010-06-29 21:05:21 -070066static void android_view_GLES20Canvas_setViewport(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -070067 OpenGLRenderer* renderer, jint width, jint height) {
68 renderer->setViewport(width, height);
Romain Guye4d01122010-06-16 18:44:05 -070069}
70
Romain Guyce0537b2010-06-29 21:05:21 -070071static void android_view_GLES20Canvas_prepare(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -070072 OpenGLRenderer* renderer) {
73 renderer->prepare();
Romain Guye4d01122010-06-16 18:44:05 -070074}
75
76// ----------------------------------------------------------------------------
Romain Guybb9524b2010-06-22 18:56:38 -070077// State
78// ----------------------------------------------------------------------------
79
Romain Guyce0537b2010-06-29 21:05:21 -070080static jint android_view_GLES20Canvas_save(JNIEnv* env, jobject canvas, OpenGLRenderer* renderer,
Romain Guybb9524b2010-06-22 18:56:38 -070081 jint flags) {
Romain Guyf6a11b82010-06-23 17:47:49 -070082 return renderer->save(flags);
Romain Guybb9524b2010-06-22 18:56:38 -070083}
84
Romain Guyce0537b2010-06-29 21:05:21 -070085static jint android_view_GLES20Canvas_getSaveCount(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -070086 OpenGLRenderer* renderer) {
87 return renderer->getSaveCount();
Romain Guybb9524b2010-06-22 18:56:38 -070088}
89
Romain Guyce0537b2010-06-29 21:05:21 -070090static void android_view_GLES20Canvas_restore(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -070091 OpenGLRenderer* renderer) {
92 renderer->restore();
Romain Guybb9524b2010-06-22 18:56:38 -070093}
94
Romain Guyce0537b2010-06-29 21:05:21 -070095static void android_view_GLES20Canvas_restoreToCount(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -070096 OpenGLRenderer* renderer, jint saveCount) {
97 renderer->restoreToCount(saveCount);
Romain Guybb9524b2010-06-22 18:56:38 -070098}
99
100// ----------------------------------------------------------------------------
Romain Guybd6b79b2010-06-26 00:13:53 -0700101// Layers
102// ----------------------------------------------------------------------------
103
Romain Guyce0537b2010-06-29 21:05:21 -0700104static jint android_view_GLES20Canvas_saveLayer(JNIEnv* env, jobject canvas,
Romain Guybd6b79b2010-06-26 00:13:53 -0700105 OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
106 SkPaint* paint, jint saveFlags) {
107 return renderer->saveLayer(left, top, right, bottom, paint, saveFlags);
108}
109
Romain Guyce0537b2010-06-29 21:05:21 -0700110static jint android_view_GLES20Canvas_saveLayerAlpha(JNIEnv* env, jobject canvas,
Romain Guybd6b79b2010-06-26 00:13:53 -0700111 OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
112 jint alpha, jint saveFlags) {
113 return renderer->saveLayerAlpha(left, top, right, bottom, alpha, saveFlags);
114}
115
116// ----------------------------------------------------------------------------
Romain Guybb9524b2010-06-22 18:56:38 -0700117// Clipping
118// ----------------------------------------------------------------------------
119
Romain Guyce0537b2010-06-29 21:05:21 -0700120static bool android_view_GLES20Canvas_quickReject(JNIEnv* env, jobject canvas,
Romain Guyc7d53492010-06-25 13:41:57 -0700121 OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
122 SkCanvas::EdgeType edge) {
123 return renderer->quickReject(left, top, right, bottom);
124}
125
Romain Guyce0537b2010-06-29 21:05:21 -0700126static bool android_view_GLES20Canvas_clipRectF(JNIEnv* env, jobject canvas,
Romain Guy079ba2c2010-07-16 14:12:24 -0700127 OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
128 SkRegion::Op op) {
129 return renderer->clipRect(left, top, right, bottom, op);
Romain Guybb9524b2010-06-22 18:56:38 -0700130}
131
Romain Guyce0537b2010-06-29 21:05:21 -0700132static bool android_view_GLES20Canvas_clipRect(JNIEnv* env, jobject canvas,
Romain Guy079ba2c2010-07-16 14:12:24 -0700133 OpenGLRenderer* renderer, jint left, jint top, jint right, jint bottom,
134 SkRegion::Op op) {
135 return renderer->clipRect(float(left), float(top), float(right), float(bottom), op);
Romain Guyf6a11b82010-06-23 17:47:49 -0700136}
Romain Guybb9524b2010-06-22 18:56:38 -0700137
Romain Guyce0537b2010-06-29 21:05:21 -0700138static bool android_view_GLES20Canvas_getClipBounds(JNIEnv* env, jobject canvas,
Romain Guy9d5316e2010-06-24 19:30:36 -0700139 OpenGLRenderer* renderer, jobject rect) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700140 const android::uirenderer::Rect& bounds(renderer->getClipBounds());
Romain Guy9d5316e2010-06-24 19:30:36 -0700141
Romain Guy7ae7ac42010-06-25 13:46:18 -0700142 env->CallVoidMethod(rect, gRectClassInfo.set,
143 int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
Romain Guy9d5316e2010-06-24 19:30:36 -0700144
Romain Guy7ae7ac42010-06-25 13:46:18 -0700145 return !bounds.isEmpty();
Romain Guy9d5316e2010-06-24 19:30:36 -0700146}
147
Romain Guyf6a11b82010-06-23 17:47:49 -0700148// ----------------------------------------------------------------------------
149// Transforms
150// ----------------------------------------------------------------------------
151
Romain Guyce0537b2010-06-29 21:05:21 -0700152static void android_view_GLES20Canvas_translate(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -0700153 OpenGLRenderer* renderer, jfloat dx, jfloat dy) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700154 renderer->translate(dx, dy);
Romain Guyf6a11b82010-06-23 17:47:49 -0700155}
156
Romain Guyce0537b2010-06-29 21:05:21 -0700157static void android_view_GLES20Canvas_rotate(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -0700158 OpenGLRenderer* renderer, jfloat degrees) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700159 renderer->rotate(degrees);
Romain Guyf6a11b82010-06-23 17:47:49 -0700160}
161
Romain Guyce0537b2010-06-29 21:05:21 -0700162static void android_view_GLES20Canvas_scale(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -0700163 OpenGLRenderer* renderer, jfloat sx, jfloat sy) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700164 renderer->scale(sx, sy);
Romain Guyf6a11b82010-06-23 17:47:49 -0700165}
166
Romain Guyce0537b2010-06-29 21:05:21 -0700167static void android_view_GLES20Canvas_setMatrix(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -0700168 OpenGLRenderer* renderer, SkMatrix* matrix) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700169 renderer->setMatrix(matrix);
Romain Guyf6a11b82010-06-23 17:47:49 -0700170}
171
Romain Guyce0537b2010-06-29 21:05:21 -0700172static void android_view_GLES20Canvas_getMatrix(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -0700173 OpenGLRenderer* renderer, SkMatrix* matrix) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700174 renderer->getMatrix(matrix);
Romain Guyf6a11b82010-06-23 17:47:49 -0700175}
176
Romain Guyce0537b2010-06-29 21:05:21 -0700177static void android_view_GLES20Canvas_concatMatrix(JNIEnv* env, jobject canvas,
Romain Guyf6a11b82010-06-23 17:47:49 -0700178 OpenGLRenderer* renderer, SkMatrix* matrix) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700179 renderer->concatMatrix(matrix);
Romain Guybb9524b2010-06-22 18:56:38 -0700180}
181
182// ----------------------------------------------------------------------------
183// Drawing
Romain Guy85bf02f2010-06-22 13:11:24 -0700184// ----------------------------------------------------------------------------
185
Romain Guyce0537b2010-06-29 21:05:21 -0700186static void android_view_GLES20Canvas_drawBitmap(JNIEnv* env, jobject canvas,
Romain Guydbd77cd2010-07-09 10:36:05 -0700187 OpenGLRenderer* renderer, SkBitmap* bitmap, float left, float top, SkPaint* paint) {
188 renderer->drawBitmap(bitmap, left, top, paint);
Romain Guy85bf02f2010-06-22 13:11:24 -0700189}
190
Romain Guyce0537b2010-06-29 21:05:21 -0700191static void android_view_GLES20Canvas_drawBitmapRect(JNIEnv* env, jobject canvas,
192 OpenGLRenderer* renderer, SkBitmap* bitmap,
193 float srcLeft, float srcTop, float srcRight, float srcBottom,
Romain Guydbd77cd2010-07-09 10:36:05 -0700194 float dstLeft, float dstTop, float dstRight, float dstBottom, SkPaint* paint) {
195 renderer->drawBitmap(bitmap, srcLeft, srcTop, srcRight, srcBottom,
196 dstLeft, dstTop, dstRight, dstBottom, paint);
Romain Guyf86ef572010-07-01 11:05:42 -0700197}
Romain Guy8ba548f2010-06-30 19:21:21 -0700198
Romain Guyf86ef572010-07-01 11:05:42 -0700199static void android_view_GLES20Canvas_drawBitmapMatrix(JNIEnv* env, jobject canvas,
Romain Guydbd77cd2010-07-09 10:36:05 -0700200 OpenGLRenderer* renderer, SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint) {
201 renderer->drawBitmap(bitmap, matrix, paint);
Romain Guyce0537b2010-06-29 21:05:21 -0700202}
203
Romain Guydeba7852010-07-07 17:54:48 -0700204static void android_view_GLES20Canvas_drawPatch(JNIEnv* env, jobject canvas,
205 OpenGLRenderer* renderer, SkBitmap* bitmap, jbyteArray chunks,
Romain Guydbd77cd2010-07-09 10:36:05 -0700206 float left, float top, float right, float bottom, SkPaint* paint) {
Romain Guydeba7852010-07-07 17:54:48 -0700207 jbyte* storage = env->GetByteArrayElements(chunks, NULL);
208 Res_png_9patch* patch = reinterpret_cast<Res_png_9patch*>(storage);
209 Res_png_9patch::deserialize(patch);
210
Romain Guydbd77cd2010-07-09 10:36:05 -0700211 renderer->drawPatch(bitmap, patch, left, top, right, bottom, paint);
Romain Guydeba7852010-07-07 17:54:48 -0700212
Romain Guydeba7852010-07-07 17:54:48 -0700213 env->ReleaseByteArrayElements(chunks, storage, 0);
214}
215
Romain Guyce0537b2010-06-29 21:05:21 -0700216static void android_view_GLES20Canvas_drawColor(JNIEnv* env, jobject canvas,
217 OpenGLRenderer* renderer, jint color, SkXfermode::Mode mode) {
218 renderer->drawColor(color, mode);
219}
220
221static void android_view_GLES20Canvas_drawRect(JNIEnv* env, jobject canvas,
Romain Guyc7d53492010-06-25 13:41:57 -0700222 OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom,
223 SkPaint* paint) {
224 renderer->drawRect(left, top, right, bottom, paint);
225}
226
Romain Guy85bf02f2010-06-22 13:11:24 -0700227// ----------------------------------------------------------------------------
Romain Guyd27977d2010-07-14 19:18:51 -0700228// Shaders
229// ----------------------------------------------------------------------------
230
231static void android_view_GLES20Canvas_resetShader(JNIEnv* env, jobject canvas,
232 OpenGLRenderer* renderer) {
233 renderer->resetShader();
234}
235
236static void android_view_GLES20Canvas_setupBitmapShader(JNIEnv* env, jobject canvas,
237 OpenGLRenderer* renderer, SkShader* shader, SkBitmap* bitmap,
238 SkShader::TileMode tileX, SkShader::TileMode tileY, SkMatrix* matrix) {
239 renderer->setupBitmapShader(bitmap, tileX, tileY, matrix,
240 (shader->getFlags() & SkShader::kOpaqueAlpha_Flag) == 0);
241}
242
Romain Guy7fac2e12010-07-16 17:10:13 -0700243static void android_view_GLES20Canvas_setupLinearShader(JNIEnv* env, jobject canvas,
244 OpenGLRenderer* renderer, SkShader* shader, float* bounds, uint32_t* colors,
Romain Guyc0ac1932010-07-19 18:43:02 -0700245 float* positions, int count, SkShader::TileMode tileMode, SkMatrix* matrix) {
246 renderer->setupLinearGradientShader(shader, bounds, colors, positions, count,
247 tileMode, matrix, (shader->getFlags() & SkShader::kOpaqueAlpha_Flag) == 0);
Romain Guy7fac2e12010-07-16 17:10:13 -0700248}
249
Romain Guyd27977d2010-07-14 19:18:51 -0700250// ----------------------------------------------------------------------------
Romain Guya1db5742010-07-20 13:09:13 -0700251// Text
252// ----------------------------------------------------------------------------
253
254static void android_view_GLES20Canvas_drawTextArray(JNIEnv* env, jobject canvas,
255 OpenGLRenderer* renderer, jcharArray text, int index, int count,
256 jfloat x, jfloat y, int flags, SkPaint* paint) {
257 jchar* textArray = env->GetCharArrayElements(text, NULL);
258 // TODO: draw from textArray + index
259 env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
260}
261
262static void android_view_GLES20Canvas_drawText(JNIEnv* env, jobject canvas,
263 OpenGLRenderer* renderer, jstring text, int start, int end,
264 jfloat x, jfloat y, int flags, SkPaint* paint) {
265 const jchar* textArray = env->GetStringChars(text, NULL);
266 // TODO: draw from textArray + start
267 env->ReleaseStringChars(text, textArray);
268}
269
270// ----------------------------------------------------------------------------
Romain Guye4d01122010-06-16 18:44:05 -0700271// JNI Glue
272// ----------------------------------------------------------------------------
273
274const char* const kClassPathName = "android/view/GLES20Canvas";
275
276static JNINativeMethod gMethods[] = {
Romain Guydbd77cd2010-07-09 10:36:05 -0700277 { "nCreateRenderer", "()I", (void*) android_view_GLES20Canvas_createRenderer },
278 { "nDestroyRenderer", "(I)V", (void*) android_view_GLES20Canvas_destroyRenderer },
279 { "nSetViewport", "(III)V", (void*) android_view_GLES20Canvas_setViewport },
280 { "nPrepare", "(I)V", (void*) android_view_GLES20Canvas_prepare },
Romain Guy85bf02f2010-06-22 13:11:24 -0700281
Romain Guydbd77cd2010-07-09 10:36:05 -0700282 { "nSave", "(II)I", (void*) android_view_GLES20Canvas_save },
283 { "nRestore", "(I)V", (void*) android_view_GLES20Canvas_restore },
284 { "nRestoreToCount", "(II)V", (void*) android_view_GLES20Canvas_restoreToCount },
285 { "nGetSaveCount", "(I)I", (void*) android_view_GLES20Canvas_getSaveCount },
Romain Guybb9524b2010-06-22 18:56:38 -0700286
Romain Guydbd77cd2010-07-09 10:36:05 -0700287 { "nSaveLayer", "(IFFFFII)I", (void*) android_view_GLES20Canvas_saveLayer },
288 { "nSaveLayerAlpha", "(IFFFFII)I", (void*) android_view_GLES20Canvas_saveLayerAlpha },
Romain Guyc7d53492010-06-25 13:41:57 -0700289
Romain Guydbd77cd2010-07-09 10:36:05 -0700290 { "nQuickReject", "(IFFFFI)Z", (void*) android_view_GLES20Canvas_quickReject },
Romain Guy079ba2c2010-07-16 14:12:24 -0700291 { "nClipRect", "(IFFFFI)Z", (void*) android_view_GLES20Canvas_clipRectF },
292 { "nClipRect", "(IIIIII)Z", (void*) android_view_GLES20Canvas_clipRect },
Romain Guyc7d53492010-06-25 13:41:57 -0700293
Romain Guydbd77cd2010-07-09 10:36:05 -0700294 { "nTranslate", "(IFF)V", (void*) android_view_GLES20Canvas_translate },
295 { "nRotate", "(IF)V", (void*) android_view_GLES20Canvas_rotate },
296 { "nScale", "(IFF)V", (void*) android_view_GLES20Canvas_scale },
Romain Guyc7d53492010-06-25 13:41:57 -0700297
Romain Guydbd77cd2010-07-09 10:36:05 -0700298 { "nSetMatrix", "(II)V", (void*) android_view_GLES20Canvas_setMatrix },
299 { "nGetMatrix", "(II)V", (void*) android_view_GLES20Canvas_getMatrix },
300 { "nConcatMatrix", "(II)V", (void*) android_view_GLES20Canvas_concatMatrix },
Romain Guybd6b79b2010-06-26 00:13:53 -0700301
Romain Guydbd77cd2010-07-09 10:36:05 -0700302 { "nDrawBitmap", "(IIFFI)V", (void*) android_view_GLES20Canvas_drawBitmap },
303 { "nDrawBitmap", "(IIFFFFFFFFI)V", (void*) android_view_GLES20Canvas_drawBitmapRect },
304 { "nDrawBitmap", "(IIII)V", (void*) android_view_GLES20Canvas_drawBitmapMatrix },
305 { "nDrawPatch", "(II[BFFFFI)V", (void*) android_view_GLES20Canvas_drawPatch },
306 { "nDrawColor", "(III)V", (void*) android_view_GLES20Canvas_drawColor },
307 { "nDrawRect", "(IFFFFI)V", (void*) android_view_GLES20Canvas_drawRect },
Romain Guybb9524b2010-06-22 18:56:38 -0700308
Romain Guyd27977d2010-07-14 19:18:51 -0700309 { "nResetShader", "(I)V", (void*) android_view_GLES20Canvas_resetShader },
310 { "nSetupBitmapShader", "(IIIIII)V", (void*) android_view_GLES20Canvas_setupBitmapShader },
Romain Guyc0ac1932010-07-19 18:43:02 -0700311 { "nSetupLinearShader", "(IIIIIIII)V", (void*) android_view_GLES20Canvas_setupLinearShader },
Romain Guyd27977d2010-07-14 19:18:51 -0700312
Romain Guya1db5742010-07-20 13:09:13 -0700313 { "nDrawText", "(I[CIIFFII)V", (void*) android_view_GLES20Canvas_drawTextArray },
314 { "nDrawText", "(ILjava/lang/String;IIFFII)V",
315 (void*) android_view_GLES20Canvas_drawText },
316
Romain Guy9d5316e2010-06-24 19:30:36 -0700317 { "nGetClipBounds", "(ILandroid/graphics/Rect;)Z",
Romain Guyce0537b2010-06-29 21:05:21 -0700318 (void*) android_view_GLES20Canvas_getClipBounds },
Romain Guye4d01122010-06-16 18:44:05 -0700319};
320
Romain Guy9d5316e2010-06-24 19:30:36 -0700321#define FIND_CLASS(var, className) \
322 var = env->FindClass(className); \
323 LOG_FATAL_IF(! var, "Unable to find class " className); \
324 var = jclass(env->NewGlobalRef(var));
325
326#define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \
327 var = env->GetMethodID(clazz, methodName, methodDescriptor); \
328 LOG_FATAL_IF(! var, "Unable to find method " methodName);
329
Romain Guye4d01122010-06-16 18:44:05 -0700330int register_android_view_GLES20Canvas(JNIEnv* env) {
Romain Guy7ae7ac42010-06-25 13:46:18 -0700331 FIND_CLASS(gRectClassInfo.clazz, "android/graphics/Rect");
332 GET_METHOD_ID(gRectClassInfo.set, gRectClassInfo.clazz, "set", "(IIII)V");
Romain Guy9d5316e2010-06-24 19:30:36 -0700333
Romain Guye4d01122010-06-16 18:44:05 -0700334 return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
335}
336
337};