127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich/* 227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich** 327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich** Copyright 2009, The Android Open Source Project 427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich** 524ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes** Licensed under the Apache License, Version 2.0 (the "License"); 624ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes** you may not use this file except in compliance with the License. 724ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes** You may obtain a copy of the License at 827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich** 924ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes** http://www.apache.org/licenses/LICENSE-2.0 1027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich** 1124ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes** Unless required by applicable law or agreed to in writing, software 1224ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes** distributed under the License is distributed on an "AS IS" BASIS, 1324ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1424ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes** See the License for the specific language governing permissions and 1527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich** limitations under the License. 1627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich*/ 1727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich 1827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich// This source file is automatically generated 1927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich 20bfe6333c3cf529600f41f14e3b8c5846e632c9a2Andreas Gampe#pragma GCC diagnostic ignored "-Wunused-variable" 21bfe6333c3cf529600f41f14e3b8c5846e632c9a2Andreas Gampe#pragma GCC diagnostic ignored "-Wunused-function" 22bfe6333c3cf529600f41f14e3b8c5846e632c9a2Andreas Gampe 232ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian#include <GLES/gl.h> 242ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian#include <GLES/glext.h> 252ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian 269626f8203a8c222b8960a49cdc66d540fdb688b0Jesse Hall#include <jni.h> 272279b2534272282a5b5152723235da397e49195cSteven Moreland#include <nativehelper/JNIHelp.h> 2827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich#include <android_runtime/AndroidRuntime.h> 2927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich#include <utils/misc.h> 3027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich#include <assert.h> 3127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich 3227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic int initialized = 0; 3327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich 3427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic jclass nioAccessClass; 3527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic jclass bufferClass; 3627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic jmethodID getBasePointerID; 3727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic jmethodID getBaseArrayID; 3827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic jmethodID getBaseArrayOffsetID; 3927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic jfieldID positionID; 4027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic jfieldID limitID; 4127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic jfieldID elementSizeShiftID; 4227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich 432ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian 442ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian/* special calls implemented in Android's GLES wrapper used to more 452ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian * efficiently bound-check passed arrays */ 462ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopianextern "C" { 472ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian#ifdef GL_VERSION_ES_CM_1_1 482ad0477f16c64dc3126741933f11e27353521bb4Mathias AgopianGL_API void GL_APIENTRY glColorPointerBounds(GLint size, GLenum type, GLsizei stride, 492ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian const GLvoid *ptr, GLsizei count); 502ad0477f16c64dc3126741933f11e27353521bb4Mathias AgopianGL_API void GL_APIENTRY glNormalPointerBounds(GLenum type, GLsizei stride, 512ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian const GLvoid *pointer, GLsizei count); 522ad0477f16c64dc3126741933f11e27353521bb4Mathias AgopianGL_API void GL_APIENTRY glTexCoordPointerBounds(GLint size, GLenum type, 532ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian GLsizei stride, const GLvoid *pointer, GLsizei count); 542ad0477f16c64dc3126741933f11e27353521bb4Mathias AgopianGL_API void GL_APIENTRY glVertexPointerBounds(GLint size, GLenum type, 552ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian GLsizei stride, const GLvoid *pointer, GLsizei count); 562ad0477f16c64dc3126741933f11e27353521bb4Mathias AgopianGL_API void GL_APIENTRY glPointSizePointerOESBounds(GLenum type, 572ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian GLsizei stride, const GLvoid *pointer, GLsizei count); 582ad0477f16c64dc3126741933f11e27353521bb4Mathias AgopianGL_API void GL_APIENTRY glMatrixIndexPointerOESBounds(GLint size, GLenum type, 592ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian GLsizei stride, const GLvoid *pointer, GLsizei count); 602ad0477f16c64dc3126741933f11e27353521bb4Mathias AgopianGL_API void GL_APIENTRY glWeightPointerOESBounds(GLint size, GLenum type, 612ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian GLsizei stride, const GLvoid *pointer, GLsizei count); 622ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian#endif 632ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian#ifdef GL_ES_VERSION_2_0 642ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopianstatic void glVertexAttribPointerBounds(GLuint indx, GLint size, GLenum type, 652ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian GLboolean normalized, GLsizei stride, const GLvoid *pointer, GLsizei count) { 662ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian glVertexAttribPointer(indx, size, type, normalized, stride, pointer); 672ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian} 682ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian#endif 69cee5198e7199fcbb131ff0d30165fb1d5c0107cfAndy McFadden#ifdef GL_ES_VERSION_3_0 70cee5198e7199fcbb131ff0d30165fb1d5c0107cfAndy McFaddenstatic void glVertexAttribIPointerBounds(GLuint indx, GLint size, GLenum type, 71cee5198e7199fcbb131ff0d30165fb1d5c0107cfAndy McFadden GLsizei stride, const GLvoid *pointer, GLsizei count) { 72cee5198e7199fcbb131ff0d30165fb1d5c0107cfAndy McFadden glVertexAttribIPointer(indx, size, type, stride, pointer); 73cee5198e7199fcbb131ff0d30165fb1d5c0107cfAndy McFadden} 74cee5198e7199fcbb131ff0d30165fb1d5c0107cfAndy McFadden#endif 752ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian} 762ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian 7727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich/* Cache method IDs each time the class is loaded. */ 7827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich 7927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic void 8024ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott HughesnativeClassInit(JNIEnv *_env, jclass glImplClass) 8127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich{ 8227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich jclass nioAccessClassLocal = _env->FindClass("java/nio/NIOAccess"); 8327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich nioAccessClass = (jclass) _env->NewGlobalRef(nioAccessClassLocal); 8427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich 8527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich jclass bufferClassLocal = _env->FindClass("java/nio/Buffer"); 8627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich bufferClass = (jclass) _env->NewGlobalRef(bufferClassLocal); 8727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich 8827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich getBasePointerID = _env->GetStaticMethodID(nioAccessClass, 8927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich "getBasePointer", "(Ljava/nio/Buffer;)J"); 9027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich getBaseArrayID = _env->GetStaticMethodID(nioAccessClass, 9127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich "getBaseArray", "(Ljava/nio/Buffer;)Ljava/lang/Object;"); 9227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich getBaseArrayOffsetID = _env->GetStaticMethodID(nioAccessClass, 9327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich "getBaseArrayOffset", "(Ljava/nio/Buffer;)I"); 9427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich 9527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich positionID = _env->GetFieldID(bufferClass, "position", "I"); 9627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich limitID = _env->GetFieldID(bufferClass, "limit", "I"); 9727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich elementSizeShiftID = 9827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich _env->GetFieldID(bufferClass, "_elementSizeShift", "I"); 9927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich} 10027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich 10127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic void * 10217045a16575ece34cfadb63da4791f115625df78Thomas TafertshofergetPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining, jint *offset) 10327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich{ 10427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich jint position; 10527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich jint limit; 10627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich jint elementSizeShift; 10727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich jlong pointer; 10827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich 10927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich position = _env->GetIntField(buffer, positionID); 11027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich limit = _env->GetIntField(buffer, limitID); 11127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID); 11227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich *remaining = (limit - position) << elementSizeShift; 11327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich pointer = _env->CallStaticLongMethod(nioAccessClass, 11427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich getBasePointerID, buffer); 11527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich if (pointer != 0L) { 11627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich *array = NULL; 11701c26ea89d4bbea3cf550e9328742302dd9a2b25Ashok Bhat return reinterpret_cast<void*>(pointer); 11827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich } 11924ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes 12027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich *array = (jarray) _env->CallStaticObjectMethod(nioAccessClass, 12127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich getBaseArrayID, buffer); 12217045a16575ece34cfadb63da4791f115625df78Thomas Tafertshofer *offset = _env->CallStaticIntMethod(nioAccessClass, 12327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich getBaseArrayOffsetID, buffer); 12424ce5fb2cc09d0a14406e7b935f8648c5720d27eElliott Hughes 12517045a16575ece34cfadb63da4791f115625df78Thomas Tafertshofer return NULL; 12627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich} 12727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich 1283b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass ByteArrayGetter { 1293b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic: 1303b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi static void* Get(JNIEnv* _env, jbyteArray array, jboolean* is_copy) { 1313b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi return _env->GetByteArrayElements(array, is_copy); 1323b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi } 1333b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi}; 1343b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass BooleanArrayGetter { 1353b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic: 1363b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi static void* Get(JNIEnv* _env, jbooleanArray array, jboolean* is_copy) { 1373b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi return _env->GetBooleanArrayElements(array, is_copy); 1383b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi } 1393b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi}; 1403b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass CharArrayGetter { 1413b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic: 1423b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi static void* Get(JNIEnv* _env, jcharArray array, jboolean* is_copy) { 1433b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi return _env->GetCharArrayElements(array, is_copy); 1443b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi } 1453b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi}; 1463b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass ShortArrayGetter { 1473b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic: 1483b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi static void* Get(JNIEnv* _env, jshortArray array, jboolean* is_copy) { 1493b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi return _env->GetShortArrayElements(array, is_copy); 1503b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi } 1513b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi}; 1523b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass IntArrayGetter { 1533b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic: 1543b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi static void* Get(JNIEnv* _env, jintArray array, jboolean* is_copy) { 1553b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi return _env->GetIntArrayElements(array, is_copy); 1563b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi } 1573b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi}; 1583b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass LongArrayGetter { 1593b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic: 1603b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi static void* Get(JNIEnv* _env, jlongArray array, jboolean* is_copy) { 1613b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi return _env->GetLongArrayElements(array, is_copy); 1623b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi } 1633b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi}; 1643b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass FloatArrayGetter { 1653b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic: 1663b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi static void* Get(JNIEnv* _env, jfloatArray array, jboolean* is_copy) { 1673b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi return _env->GetFloatArrayElements(array, is_copy); 1683b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi } 1693b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi}; 1703b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass DoubleArrayGetter { 1713b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic: 1723b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi static void* Get(JNIEnv* _env, jdoubleArray array, jboolean* is_copy) { 1733b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi return _env->GetDoubleArrayElements(array, is_copy); 1743b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi } 1753b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi}; 1763b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi 1773b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchitemplate<typename JTYPEARRAY, typename ARRAYGETTER> 1783b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchistatic void* 1793b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi YamauchigetArrayPointer(JNIEnv *_env, JTYPEARRAY array, jboolean* is_copy) { 1803b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi return ARRAYGETTER::Get(_env, array, is_copy); 1813b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi} 1823b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi 1833b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass ByteArrayReleaser { 1843b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic: 1853b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi static void Release(JNIEnv* _env, jbyteArray array, jbyte* data, jboolean commit) { 1863b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi _env->ReleaseByteArrayElements(array, data, commit ? 0 : JNI_ABORT); 1873b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi } 1883b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi}; 1893b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass BooleanArrayReleaser { 1903b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic: 1913b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi static void Release(JNIEnv* _env, jbooleanArray array, jboolean* data, jboolean commit) { 1923b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi _env->ReleaseBooleanArrayElements(array, data, commit ? 0 : JNI_ABORT); 1933b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi } 1943b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi}; 1953b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass CharArrayReleaser { 1963b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic: 1973b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi static void Release(JNIEnv* _env, jcharArray array, jchar* data, jboolean commit) { 1983b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi _env->ReleaseCharArrayElements(array, data, commit ? 0 : JNI_ABORT); 1993b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi } 2003b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi}; 2013b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass ShortArrayReleaser { 2023b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic: 2033b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi static void Release(JNIEnv* _env, jshortArray array, jshort* data, jboolean commit) { 2043b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi _env->ReleaseShortArrayElements(array, data, commit ? 0 : JNI_ABORT); 2053b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi } 2063b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi}; 2073b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass IntArrayReleaser { 2083b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic: 2093b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi static void Release(JNIEnv* _env, jintArray array, jint* data, jboolean commit) { 2103b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi _env->ReleaseIntArrayElements(array, data, commit ? 0 : JNI_ABORT); 2113b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi } 2123b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi}; 2133b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass LongArrayReleaser { 2143b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic: 2153b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi static void Release(JNIEnv* _env, jlongArray array, jlong* data, jboolean commit) { 2163b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi _env->ReleaseLongArrayElements(array, data, commit ? 0 : JNI_ABORT); 2173b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi } 2183b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi}; 2193b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass FloatArrayReleaser { 2203b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic: 2213b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi static void Release(JNIEnv* _env, jfloatArray array, jfloat* data, jboolean commit) { 2223b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi _env->ReleaseFloatArrayElements(array, data, commit ? 0 : JNI_ABORT); 2233b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi } 2243b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi}; 2253b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchiclass DoubleArrayReleaser { 2263b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchipublic: 2273b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi static void Release(JNIEnv* _env, jdoubleArray array, jdouble* data, jboolean commit) { 2283b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi _env->ReleaseDoubleArrayElements(array, data, commit ? 0 : JNI_ABORT); 2293b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi } 2303b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi}; 2313b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi 2323b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchitemplate<typename JTYPEARRAY, typename NTYPEARRAY, typename ARRAYRELEASER> 2333b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchistatic void 2343b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi YamauchireleaseArrayPointer(JNIEnv *_env, JTYPEARRAY array, NTYPEARRAY data, jboolean commit) { 2353b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi ARRAYRELEASER::Release(_env, array, data, commit); 2363b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi} 2373b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi 23827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic void 23927f8002e591b5c579f75b2580183b5d1c4219cd4Jack PalevichreleasePointer(JNIEnv *_env, jarray array, void *data, jboolean commit) 24027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich{ 24127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich _env->ReleasePrimitiveArrayCritical(array, data, 2422ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian commit ? 0 : JNI_ABORT); 2432ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian} 2442ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian 2452ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopianstatic void * 2462ad0477f16c64dc3126741933f11e27353521bb4Mathias AgopiangetDirectBufferPointer(JNIEnv *_env, jobject buffer) { 2472ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian char* buf = (char*) _env->GetDirectBufferAddress(buffer); 2482ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian if (buf) { 2492ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian jint position = _env->GetIntField(buffer, positionID); 2502ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian jint elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID); 2512ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian buf += position << elementSizeShift; 2522ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian } else { 2532ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian jniThrowException(_env, "java/lang/IllegalArgumentException", 2542ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian "Must use a native order direct Buffer"); 2552ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian } 2562ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian return (void*) buf; 2572ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian} 2582ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian 2592ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian// -------------------------------------------------------------------------- 2602ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian 2612ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian/* 2622ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian * returns the number of values glGet returns for a given pname. 2632ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian * 2642ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian * The code below is written such that pnames requiring only one values 2652ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian * are the default (and are not explicitely tested for). This makes the 2662ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian * checking code much shorter/readable/efficient. 2672ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian * 2682ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian * This means that unknown pnames (e.g.: extensions) will default to 1. If 2692ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian * that unknown pname needs more than 1 value, then the validation check 2702ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian * is incomplete and the app may crash if it passed the wrong number params. 2712ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian */ 2722ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopianstatic int getNeededCount(GLint pname) { 2732ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian int needed = 1; 274dc43a6c99c21e99723058bab4041e80557795a74Romain Guy#ifdef GL_ES_VERSION_3_0 275dc43a6c99c21e99723058bab4041e80557795a74Romain Guy // GLES 3.x pnames 276dc43a6c99c21e99723058bab4041e80557795a74Romain Guy switch (pname) { 277dc43a6c99c21e99723058bab4041e80557795a74Romain Guy case GL_MAX_VIEWPORT_DIMS: 278dc43a6c99c21e99723058bab4041e80557795a74Romain Guy needed = 2; 279dc43a6c99c21e99723058bab4041e80557795a74Romain Guy break; 280dc43a6c99c21e99723058bab4041e80557795a74Romain Guy 281dc43a6c99c21e99723058bab4041e80557795a74Romain Guy case GL_PROGRAM_BINARY_FORMATS: 282dc43a6c99c21e99723058bab4041e80557795a74Romain Guy glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &needed); 283dc43a6c99c21e99723058bab4041e80557795a74Romain Guy break; 284dc43a6c99c21e99723058bab4041e80557795a74Romain Guy } 285dc43a6c99c21e99723058bab4041e80557795a74Romain Guy#endif 286dc43a6c99c21e99723058bab4041e80557795a74Romain Guy 2872ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian#ifdef GL_ES_VERSION_2_0 2882ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian // GLES 2.x pnames 2892ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian switch (pname) { 2902ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_ALIASED_LINE_WIDTH_RANGE: 2912ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_ALIASED_POINT_SIZE_RANGE: 2922ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian needed = 2; 2932ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian break; 2942ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian 2952ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_BLEND_COLOR: 2962ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_COLOR_CLEAR_VALUE: 2972ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_COLOR_WRITEMASK: 2982ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_SCISSOR_BOX: 2992ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_VIEWPORT: 3002ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian needed = 4; 3012ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian break; 3022ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian 3032ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_COMPRESSED_TEXTURE_FORMATS: 3042ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &needed); 3052ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian break; 3062ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian 3072ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_SHADER_BINARY_FORMATS: 3082ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian glGetIntegerv(GL_NUM_SHADER_BINARY_FORMATS, &needed); 3092ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian break; 3102ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian } 3112ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian#endif 3122ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian 3132ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian#ifdef GL_VERSION_ES_CM_1_1 3142ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian // GLES 1.x pnames 3152ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian switch (pname) { 3162ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_ALIASED_LINE_WIDTH_RANGE: 3172ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_ALIASED_POINT_SIZE_RANGE: 3182ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_DEPTH_RANGE: 3192ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_SMOOTH_LINE_WIDTH_RANGE: 3202ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_SMOOTH_POINT_SIZE_RANGE: 3212ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian needed = 2; 3222ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian break; 3232ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian 3242ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_CURRENT_NORMAL: 3252ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_POINT_DISTANCE_ATTENUATION: 3262ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian needed = 3; 3272ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian break; 3282ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian 3292ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_COLOR_CLEAR_VALUE: 3302ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_COLOR_WRITEMASK: 3312ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_CURRENT_COLOR: 3322ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_CURRENT_TEXTURE_COORDS: 3332ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_FOG_COLOR: 3342ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_LIGHT_MODEL_AMBIENT: 3352ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_SCISSOR_BOX: 3362ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_VIEWPORT: 3372ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian needed = 4; 3382ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian break; 3392ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian 3402ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_MODELVIEW_MATRIX: 3412ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_PROJECTION_MATRIX: 3422ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_TEXTURE_MATRIX: 3432ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian needed = 16; 3442ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian break; 3452ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian 3462ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian case GL_COMPRESSED_TEXTURE_FORMATS: 3472ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &needed); 3482ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian break; 3492ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian } 3502ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian#endif 3512ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian return needed; 3522ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian} 3532ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian 3543b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchitemplate <typename JTYPEARRAY, typename ARRAYGETTER, typename NTYPEARRAY, 3553b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi typename ARRAYRELEASER, typename CTYPE, void GET(GLenum, CTYPE*)> 3562ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopianstatic void 3572ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopianget 3582ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian (JNIEnv *_env, jobject _this, jint pname, JTYPEARRAY params_ref, jint offset) { 3592ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian jint _exception = 0; 3602ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian const char * _exceptionType; 3612ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian const char * _exceptionMessage; 3622ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian CTYPE *params_base = (CTYPE *) 0; 3632ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian jint _remaining; 3642ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian CTYPE *params = (CTYPE *) 0; 3652ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian int _needed = 0; 3662ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian 3672ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian if (!params_ref) { 3682ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian _exception = 1; 3692ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian _exceptionType = "java/lang/IllegalArgumentException"; 3702ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian _exceptionMessage = "params == null"; 3712ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian goto exit; 3722ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian } 3732ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian if (offset < 0) { 3742ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian _exception = 1; 3752ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian _exceptionType = "java/lang/IllegalArgumentException"; 3762ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian _exceptionMessage = "offset < 0"; 3772ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian goto exit; 3782ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian } 3792ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian _remaining = _env->GetArrayLength(params_ref) - offset; 3802ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian _needed = getNeededCount(pname); 3812ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian // if we didn't find this pname, we just assume the user passed 3822ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian // an array of the right size -- this might happen with extensions 3832ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian // or if we forget an enum here. 3842ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian if (_remaining < _needed) { 3852ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian _exception = 1; 3862ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian _exceptionType = "java/lang/IllegalArgumentException"; 3872ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian _exceptionMessage = "length - offset < needed"; 3882ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian goto exit; 3892ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian } 3903b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi params_base = (CTYPE *) getArrayPointer<JTYPEARRAY, ARRAYGETTER>( 3913b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi _env, params_ref, (jboolean *)0); 3922ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian params = params_base + offset; 3932ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian 3942ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian GET( 3952ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian (GLenum)pname, 3962ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian (CTYPE *)params 3972ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian ); 3982ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian 3992ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopianexit: 4002ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian if (params_base) { 4013b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi releaseArrayPointer<JTYPEARRAY, NTYPEARRAY, ARRAYRELEASER>( 4023b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi _env, params_ref, params_base, !_exception); 4032ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian } 4042ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian if (_exception) { 4052ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian jniThrowException(_env, _exceptionType, _exceptionMessage); 4062ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian } 4072ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian} 4082ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian 4092ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian 4103b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchitemplate <typename CTYPE, typename JTYPEARRAY, typename ARRAYGETTER, typename NTYPEARRAY, 4113b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi typename ARRAYRELEASER, void GET(GLenum, CTYPE*)> 4122ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopianstatic void 4132ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopiangetarray 4142ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian (JNIEnv *_env, jobject _this, jint pname, jobject params_buf) { 4152ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian jint _exception = 0; 4162ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian const char * _exceptionType; 4172ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian const char * _exceptionMessage; 4183b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi JTYPEARRAY _array = (JTYPEARRAY) 0; 4192ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian jint _bufferOffset = (jint) 0; 4202ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian jint _remaining; 4212ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian CTYPE *params = (CTYPE *) 0; 4222ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian int _needed = 0; 4232ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian 4243b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi params = (CTYPE *)getPointer(_env, params_buf, (jarray*)&_array, &_remaining, &_bufferOffset); 425cee5198e7199fcbb131ff0d30165fb1d5c0107cfAndy McFadden _remaining /= sizeof(CTYPE); // convert from bytes to item count 4262ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian _needed = getNeededCount(pname); 4272ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian // if we didn't find this pname, we just assume the user passed 4282ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian // an array of the right size -- this might happen with extensions 4292ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian // or if we forget an enum here. 4302ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian if (_needed>0 && _remaining < _needed) { 4312ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian _exception = 1; 4322ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian _exceptionType = "java/lang/IllegalArgumentException"; 4332ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian _exceptionMessage = "remaining() < needed"; 4342ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian goto exit; 4352ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian } 4362ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian if (params == NULL) { 4373b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi char * _paramsBase = (char *) getArrayPointer<JTYPEARRAY, ARRAYGETTER>( 4383b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi _env, _array, (jboolean *) 0); 4392ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian params = (CTYPE *) (_paramsBase + _bufferOffset); 4402ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian } 4412ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian GET( 4422ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian (GLenum)pname, 4432ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian (CTYPE *)params 4442ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian ); 4452ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian 4462ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopianexit: 4472ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian if (_array) { 4483b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi releaseArrayPointer<JTYPEARRAY, NTYPEARRAY, ARRAYRELEASER>( 4493b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi _env, _array, (NTYPEARRAY)params, _exception ? JNI_FALSE : JNI_TRUE); 4502ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian } 4512ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian if (_exception) { 4522ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian jniThrowException(_env, _exceptionType, _exceptionMessage); 4532ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian } 45427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich} 45527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich 45627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich// -------------------------------------------------------------------------- 45727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich/* GLbitfield glQueryMatrixxOES ( GLfixed *mantissa, GLint *exponent ) */ 45827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic jint 45927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichandroid_glQueryMatrixxOES___3II_3II 46027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich (JNIEnv *_env, jobject _this, jintArray mantissa_ref, jint mantissaOffset, jintArray exponent_ref, jint exponentOffset) { 46127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich jint _exception = 0; 4622ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian const char * _exceptionType = NULL; 4632ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian const char * _exceptionMessage = NULL; 46427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich GLbitfield _returnValue = -1; 46527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich GLfixed *mantissa_base = (GLfixed *) 0; 46627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich jint _mantissaRemaining; 46727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich GLfixed *mantissa = (GLfixed *) 0; 46827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich GLint *exponent_base = (GLint *) 0; 46927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich jint _exponentRemaining; 47027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich GLint *exponent = (GLint *) 0; 47127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich 47227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich if (!mantissa_ref) { 47327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich _exception = 1; 4742545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer _exceptionType = "java/lang/IllegalArgumentException"; 4752545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer _exceptionMessage = "mantissa == null"; 47627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich goto exit; 47727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich } 47827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich if (mantissaOffset < 0) { 47927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich _exception = 1; 4802545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer _exceptionType = "java/lang/IllegalArgumentException"; 4812545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer _exceptionMessage = "mantissaOffset < 0"; 48227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich goto exit; 48327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich } 48427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich _mantissaRemaining = _env->GetArrayLength(mantissa_ref) - mantissaOffset; 48527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich if (_mantissaRemaining < 16) { 48627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich _exception = 1; 4872545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer _exceptionType = "java/lang/IllegalArgumentException"; 4882545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer _exceptionMessage = "length - mantissaOffset < 16 < needed"; 48927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich goto exit; 49027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich } 49127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich mantissa_base = (GLfixed *) 4923b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi _env->GetIntArrayElements(mantissa_ref, (jboolean *)0); 49327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich mantissa = mantissa_base + mantissaOffset; 49427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich 49527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich if (!exponent_ref) { 49627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich _exception = 1; 4972545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer _exceptionType = "java/lang/IllegalArgumentException"; 4982545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer _exceptionMessage = "exponent == null"; 49927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich goto exit; 50027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich } 50127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich if (exponentOffset < 0) { 50227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich _exception = 1; 5032545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer _exceptionType = "java/lang/IllegalArgumentException"; 5042545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer _exceptionMessage = "exponentOffset < 0"; 50527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich goto exit; 50627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich } 50727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich _exponentRemaining = _env->GetArrayLength(exponent_ref) - exponentOffset; 50827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich if (_exponentRemaining < 16) { 50927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich _exception = 1; 5102545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer _exceptionType = "java/lang/IllegalArgumentException"; 5112545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer _exceptionMessage = "length - exponentOffset < 16 < needed"; 51227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich goto exit; 51327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich } 51427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich exponent_base = (GLint *) 5153b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi _env->GetIntArrayElements(exponent_ref, (jboolean *)0); 51627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich exponent = exponent_base + exponentOffset; 51727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich 51827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich _returnValue = glQueryMatrixxOES( 51927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich (GLfixed *)mantissa, 52027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich (GLint *)exponent 52127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich ); 52227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich 52327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichexit: 52427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich if (exponent_base) { 5253b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi _env->ReleaseIntArrayElements(exponent_ref, (jint*)exponent_base, 52627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich _exception ? JNI_ABORT: 0); 52727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich } 52827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich if (mantissa_base) { 5293b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi _env->ReleaseIntArrayElements(mantissa_ref, (jint*)mantissa_base, 53027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich _exception ? JNI_ABORT: 0); 53127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich } 5322545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer if (_exception) { 5332545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer jniThrowException(_env, _exceptionType, _exceptionMessage); 5342545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer } 535cee5198e7199fcbb131ff0d30165fb1d5c0107cfAndy McFadden return (jint)_returnValue; 53627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich} 53727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich 53827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich/* GLbitfield glQueryMatrixxOES ( GLfixed *mantissa, GLint *exponent ) */ 53927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic jint 54027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichandroid_glQueryMatrixxOES__Ljava_nio_IntBuffer_2Ljava_nio_IntBuffer_2 54127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich (JNIEnv *_env, jobject _this, jobject mantissa_buf, jobject exponent_buf) { 54227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich jint _exception = 0; 5432ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian const char * _exceptionType = NULL; 5442ad0477f16c64dc3126741933f11e27353521bb4Mathias Agopian const char * _exceptionMessage = NULL; 5453b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi jintArray _mantissaArray = (jintArray) 0; 54617045a16575ece34cfadb63da4791f115625df78Thomas Tafertshofer jint _mantissaBufferOffset = (jint) 0; 5473b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi jintArray _exponentArray = (jintArray) 0; 54817045a16575ece34cfadb63da4791f115625df78Thomas Tafertshofer jint _exponentBufferOffset = (jint) 0; 54927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich GLbitfield _returnValue = -1; 55027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich jint _mantissaRemaining; 55127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich GLfixed *mantissa = (GLfixed *) 0; 55227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich jint _exponentRemaining; 55327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich GLint *exponent = (GLint *) 0; 55427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich 55584cac20dfdff35932901e978e6b6d3da843a2fa7Romain Guy if (!mantissa_buf) { 55684cac20dfdff35932901e978e6b6d3da843a2fa7Romain Guy _exception = 1; 55784cac20dfdff35932901e978e6b6d3da843a2fa7Romain Guy _exceptionType = "java/lang/IllegalArgumentException"; 55884cac20dfdff35932901e978e6b6d3da843a2fa7Romain Guy _exceptionMessage = "mantissa == null"; 55984cac20dfdff35932901e978e6b6d3da843a2fa7Romain Guy goto exit; 56084cac20dfdff35932901e978e6b6d3da843a2fa7Romain Guy } 5613b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi mantissa = (GLfixed *)getPointer(_env, mantissa_buf, (jarray*)&_mantissaArray, &_mantissaRemaining, &_mantissaBufferOffset); 56227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich if (_mantissaRemaining < 16) { 56327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich _exception = 1; 5642545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer _exceptionType = "java/lang/IllegalArgumentException"; 5652545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer _exceptionMessage = "remaining() < 16 < needed"; 56627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich goto exit; 56727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich } 56884cac20dfdff35932901e978e6b6d3da843a2fa7Romain Guy if (!exponent_buf) { 56984cac20dfdff35932901e978e6b6d3da843a2fa7Romain Guy _exception = 1; 57084cac20dfdff35932901e978e6b6d3da843a2fa7Romain Guy _exceptionType = "java/lang/IllegalArgumentException"; 57184cac20dfdff35932901e978e6b6d3da843a2fa7Romain Guy _exceptionMessage = "exponent == null"; 57284cac20dfdff35932901e978e6b6d3da843a2fa7Romain Guy goto exit; 57384cac20dfdff35932901e978e6b6d3da843a2fa7Romain Guy } 5743b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi exponent = (GLint *)getPointer(_env, exponent_buf, (jarray*)&_exponentArray, &_exponentRemaining, &_exponentBufferOffset); 57527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich if (_exponentRemaining < 16) { 57627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich _exception = 1; 5772545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer _exceptionType = "java/lang/IllegalArgumentException"; 5782545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer _exceptionMessage = "remaining() < 16 < needed"; 57927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich goto exit; 58027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich } 58117045a16575ece34cfadb63da4791f115625df78Thomas Tafertshofer if (mantissa == NULL) { 5823b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi char * _mantissaBase = (char *)_env->GetIntArrayElements(_mantissaArray, (jboolean *) 0); 58317045a16575ece34cfadb63da4791f115625df78Thomas Tafertshofer mantissa = (GLfixed *) (_mantissaBase + _mantissaBufferOffset); 58417045a16575ece34cfadb63da4791f115625df78Thomas Tafertshofer } 58517045a16575ece34cfadb63da4791f115625df78Thomas Tafertshofer if (exponent == NULL) { 5863b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi char * _exponentBase = (char *)_env->GetIntArrayElements(_exponentArray, (jboolean *) 0); 58717045a16575ece34cfadb63da4791f115625df78Thomas Tafertshofer exponent = (GLint *) (_exponentBase + _exponentBufferOffset); 58817045a16575ece34cfadb63da4791f115625df78Thomas Tafertshofer } 58927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich _returnValue = glQueryMatrixxOES( 59027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich (GLfixed *)mantissa, 59127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich (GLint *)exponent 59227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich ); 59327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich 59427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichexit: 59527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich if (_exponentArray) { 5963b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi _env->ReleaseIntArrayElements(_exponentArray, (jint*)exponent, _exception ? JNI_ABORT : 0); 59717045a16575ece34cfadb63da4791f115625df78Thomas Tafertshofer } 59817045a16575ece34cfadb63da4791f115625df78Thomas Tafertshofer if (_mantissaArray) { 5993b1d46e809ed38cd5662c110c511b8d98868ed72Hiroshi Yamauchi _env->ReleaseIntArrayElements(_mantissaArray, (jint*)mantissa, _exception ? JNI_ABORT : 0); 60027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich } 6012545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer if (_exception) { 6022545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer jniThrowException(_env, _exceptionType, _exceptionMessage); 6032545b32ced69100fe70685b95315c6adf411083bThomas Tafertshofer } 604cee5198e7199fcbb131ff0d30165fb1d5c0107cfAndy McFadden return (jint)_returnValue; 60527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich} 60627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich 60727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichstatic const char *classPathName = "android/opengl/GLES10Ext"; 60827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich 60976f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod methods[] = { 61027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich{"_nativeClassInit", "()V", (void*)nativeClassInit }, 61127f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich{"glQueryMatrixxOES", "([II[II)I", (void *) android_glQueryMatrixxOES___3II_3II }, 61227f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich{"glQueryMatrixxOES", "(Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;)I", (void *) android_glQueryMatrixxOES__Ljava_nio_IntBuffer_2Ljava_nio_IntBuffer_2 }, 61327f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich}; 61427f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich 61527f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevichint register_android_opengl_jni_GLES10Ext(JNIEnv *_env) 61627f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich{ 61727f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich int err; 61827f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich err = android::AndroidRuntime::registerNativeMethods(_env, classPathName, methods, NELEM(methods)); 61927f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich return err; 62027f8002e591b5c579f75b2580183b5d1c4219cd4Jack Palevich} 621