1 /* 2 ** 3 ** Copyright 2009, The Android Open Source Project 4 ** 5 ** Licensed under the Apache License, Version 2.0 (the "License"); 6 ** you may not use this file except in compliance with the License. 7 ** You may obtain a copy of the License at 8 ** 9 ** http://www.apache.org/licenses/LICENSE-2.0 10 ** 11 ** Unless required by applicable law or agreed to in writing, software 12 ** distributed under the License is distributed on an "AS IS" BASIS, 13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 ** See the License for the specific language governing permissions and 15 ** limitations under the License. 16 */ 17 18 // This source file is automatically generated 19 20 #include "jni.h" 21 #include "JNIHelp.h" 22 #include <android_runtime/AndroidRuntime.h> 23 #include <utils/misc.h> 24 25 #include <assert.h> 26 #include <GLES/gl.h> 27 #include <GLES/glext.h> 28 29 static int initialized = 0; 30 31 static jclass nioAccessClass; 32 static jclass bufferClass; 33 static jmethodID getBasePointerID; 34 static jmethodID getBaseArrayID; 35 static jmethodID getBaseArrayOffsetID; 36 static jfieldID positionID; 37 static jfieldID limitID; 38 static jfieldID elementSizeShiftID; 39 40 /* Cache method IDs each time the class is loaded. */ 41 42 static void 43 nativeClassInit(JNIEnv *_env, jclass glImplClass) 44 { 45 jclass nioAccessClassLocal = _env->FindClass("java/nio/NIOAccess"); 46 nioAccessClass = (jclass) _env->NewGlobalRef(nioAccessClassLocal); 47 48 jclass bufferClassLocal = _env->FindClass("java/nio/Buffer"); 49 bufferClass = (jclass) _env->NewGlobalRef(bufferClassLocal); 50 51 getBasePointerID = _env->GetStaticMethodID(nioAccessClass, 52 "getBasePointer", "(Ljava/nio/Buffer;)J"); 53 getBaseArrayID = _env->GetStaticMethodID(nioAccessClass, 54 "getBaseArray", "(Ljava/nio/Buffer;)Ljava/lang/Object;"); 55 getBaseArrayOffsetID = _env->GetStaticMethodID(nioAccessClass, 56 "getBaseArrayOffset", "(Ljava/nio/Buffer;)I"); 57 58 positionID = _env->GetFieldID(bufferClass, "position", "I"); 59 limitID = _env->GetFieldID(bufferClass, "limit", "I"); 60 elementSizeShiftID = 61 _env->GetFieldID(bufferClass, "_elementSizeShift", "I"); 62 } 63 64 65 static void * 66 getPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining) 67 { 68 jint position; 69 jint limit; 70 jint elementSizeShift; 71 jlong pointer; 72 jint offset; 73 void *data; 74 75 position = _env->GetIntField(buffer, positionID); 76 limit = _env->GetIntField(buffer, limitID); 77 elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID); 78 *remaining = (limit - position) << elementSizeShift; 79 pointer = _env->CallStaticLongMethod(nioAccessClass, 80 getBasePointerID, buffer); 81 if (pointer != 0L) { 82 *array = NULL; 83 return (void *) (jint) pointer; 84 } 85 86 *array = (jarray) _env->CallStaticObjectMethod(nioAccessClass, 87 getBaseArrayID, buffer); 88 offset = _env->CallStaticIntMethod(nioAccessClass, 89 getBaseArrayOffsetID, buffer); 90 data = _env->GetPrimitiveArrayCritical(*array, (jboolean *) 0); 91 92 return (void *) ((char *) data + offset); 93 } 94 95 96 static void 97 releasePointer(JNIEnv *_env, jarray array, void *data, jboolean commit) 98 { 99 _env->ReleasePrimitiveArrayCritical(array, data, 100 commit ? 0 : JNI_ABORT); 101 } 102 103 // -------------------------------------------------------------------------- 104 /* GLbitfield glQueryMatrixxOES ( GLfixed *mantissa, GLint *exponent ) */ 105 static jint 106 android_glQueryMatrixxOES___3II_3II 107 (JNIEnv *_env, jobject _this, jintArray mantissa_ref, jint mantissaOffset, jintArray exponent_ref, jint exponentOffset) { 108 jint _exception = 0; 109 GLbitfield _returnValue = -1; 110 GLfixed *mantissa_base = (GLfixed *) 0; 111 jint _mantissaRemaining; 112 GLfixed *mantissa = (GLfixed *) 0; 113 GLint *exponent_base = (GLint *) 0; 114 jint _exponentRemaining; 115 GLint *exponent = (GLint *) 0; 116 117 if (!mantissa_ref) { 118 _exception = 1; 119 jniThrowException(_env, "java/lang/IllegalArgumentException", "mantissa == null"); 120 goto exit; 121 } 122 if (mantissaOffset < 0) { 123 _exception = 1; 124 jniThrowException(_env, "java/lang/IllegalArgumentException", "mantissaOffset < 0"); 125 goto exit; 126 } 127 _mantissaRemaining = _env->GetArrayLength(mantissa_ref) - mantissaOffset; 128 if (_mantissaRemaining < 16) { 129 _exception = 1; 130 jniThrowException(_env, "java/lang/IllegalArgumentException", "length - mantissaOffset < 16"); 131 goto exit; 132 } 133 mantissa_base = (GLfixed *) 134 _env->GetPrimitiveArrayCritical(mantissa_ref, (jboolean *)0); 135 mantissa = mantissa_base + mantissaOffset; 136 137 if (!exponent_ref) { 138 _exception = 1; 139 jniThrowException(_env, "java/lang/IllegalArgumentException", "exponent == null"); 140 goto exit; 141 } 142 if (exponentOffset < 0) { 143 _exception = 1; 144 jniThrowException(_env, "java/lang/IllegalArgumentException", "exponentOffset < 0"); 145 goto exit; 146 } 147 _exponentRemaining = _env->GetArrayLength(exponent_ref) - exponentOffset; 148 if (_exponentRemaining < 16) { 149 _exception = 1; 150 jniThrowException(_env, "java/lang/IllegalArgumentException", "length - exponentOffset < 16"); 151 goto exit; 152 } 153 exponent_base = (GLint *) 154 _env->GetPrimitiveArrayCritical(exponent_ref, (jboolean *)0); 155 exponent = exponent_base + exponentOffset; 156 157 _returnValue = glQueryMatrixxOES( 158 (GLfixed *)mantissa, 159 (GLint *)exponent 160 ); 161 162 exit: 163 if (exponent_base) { 164 _env->ReleasePrimitiveArrayCritical(exponent_ref, exponent_base, 165 _exception ? JNI_ABORT: 0); 166 } 167 if (mantissa_base) { 168 _env->ReleasePrimitiveArrayCritical(mantissa_ref, mantissa_base, 169 _exception ? JNI_ABORT: 0); 170 } 171 return _returnValue; 172 } 173 174 /* GLbitfield glQueryMatrixxOES ( GLfixed *mantissa, GLint *exponent ) */ 175 static jint 176 android_glQueryMatrixxOES__Ljava_nio_IntBuffer_2Ljava_nio_IntBuffer_2 177 (JNIEnv *_env, jobject _this, jobject mantissa_buf, jobject exponent_buf) { 178 jint _exception = 0; 179 jarray _mantissaArray = (jarray) 0; 180 jarray _exponentArray = (jarray) 0; 181 GLbitfield _returnValue = -1; 182 jint _mantissaRemaining; 183 GLfixed *mantissa = (GLfixed *) 0; 184 jint _exponentRemaining; 185 GLint *exponent = (GLint *) 0; 186 187 mantissa = (GLfixed *)getPointer(_env, mantissa_buf, &_mantissaArray, &_mantissaRemaining); 188 if (_mantissaRemaining < 16) { 189 _exception = 1; 190 jniThrowException(_env, "java/lang/IllegalArgumentException", "remaining() < 16"); 191 goto exit; 192 } 193 exponent = (GLint *)getPointer(_env, exponent_buf, &_exponentArray, &_exponentRemaining); 194 if (_exponentRemaining < 16) { 195 _exception = 1; 196 jniThrowException(_env, "java/lang/IllegalArgumentException", "remaining() < 16"); 197 goto exit; 198 } 199 _returnValue = glQueryMatrixxOES( 200 (GLfixed *)mantissa, 201 (GLint *)exponent 202 ); 203 204 exit: 205 if (_mantissaArray) { 206 releasePointer(_env, _mantissaArray, exponent, _exception ? JNI_FALSE : JNI_TRUE); 207 } 208 if (_exponentArray) { 209 releasePointer(_env, _exponentArray, mantissa, _exception ? JNI_FALSE : JNI_TRUE); 210 } 211 return _returnValue; 212 } 213 214 static const char *classPathName = "android/opengl/GLES10Ext"; 215 216 static JNINativeMethod methods[] = { 217 {"_nativeClassInit", "()V", (void*)nativeClassInit }, 218 {"glQueryMatrixxOES", "([II[II)I", (void *) android_glQueryMatrixxOES___3II_3II }, 219 {"glQueryMatrixxOES", "(Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;)I", (void *) android_glQueryMatrixxOES__Ljava_nio_IntBuffer_2Ljava_nio_IntBuffer_2 }, 220 }; 221 222 int register_android_opengl_jni_GLES10Ext(JNIEnv *_env) 223 { 224 int err; 225 err = android::AndroidRuntime::registerNativeMethods(_env, classPathName, methods, NELEM(methods)); 226 return err; 227 } 228