1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 2427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich** Copyright 2009, The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 49875750593aae7c2a62f33c620809d49162393ebElliott Hughes** Licensed under the Apache License, Version 2.0 (the "License"); 59875750593aae7c2a62f33c620809d49162393ebElliott Hughes** you may not use this file except in compliance with the License. 69875750593aae7c2a62f33c620809d49162393ebElliott Hughes** You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 89875750593aae7c2a62f33c620809d49162393ebElliott Hughes** http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 109875750593aae7c2a62f33c620809d49162393ebElliott Hughes** Unless required by applicable law or agreed to in writing, software 119875750593aae7c2a62f33c620809d49162393ebElliott Hughes** distributed under the License is distributed on an "AS IS" BASIS, 129875750593aae7c2a62f33c620809d49162393ebElliott Hughes** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139875750593aae7c2a62f33c620809d49162393ebElliott Hughes** See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*/ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// This source file is automatically generated 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 199875750593aae7c2a62f33c620809d49162393ebElliott Hughes#include "jni.h" 209875750593aae7c2a62f33c620809d49162393ebElliott Hughes#include "JNIHelp.h" 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <android_runtime/AndroidRuntime.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/misc.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <assert.h> 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h> 26593f203ba3df251b238409bb3fcc66b0a90b856dJack Palevich#include <GLES/glext.h> 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2866089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich/* special calls implemented in Android's GLES wrapper used to more 2966089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich * efficiently bound-check passed arrays */ 3066089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevichextern "C" { 3166089a33ea4efda711a3a5180f0b001bdac48dcfJack PalevichGL_API void GL_APIENTRY glMatrixIndexPointerOESBounds(GLint size, GLenum type, GLsizei stride, 3266089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich const GLvoid *ptr, GLsizei count); 3366089a33ea4efda711a3a5180f0b001bdac48dcfJack PalevichGL_API void GL_APIENTRY glWeightPointerOESBounds(GLint size, GLenum type, GLsizei stride, 3466089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich const GLvoid *ptr, GLsizei count); 3566089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich} 3666089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int initialized = 0; 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic jclass nioAccessClass; 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic jclass bufferClass; 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic jmethodID getBasePointerID; 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic jmethodID getBaseArrayID; 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic jmethodID getBaseArrayOffsetID; 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic jfieldID positionID; 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic jfieldID limitID; 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic jfieldID elementSizeShiftID; 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* Cache method IDs each time the class is loaded. */ 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 50427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevichstatic void 519875750593aae7c2a62f33c620809d49162393ebElliott HughesnativeClassInit(JNIEnv *_env, jclass glImplClass) 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jclass nioAccessClassLocal = _env->FindClass("java/nio/NIOAccess"); 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project nioAccessClass = (jclass) _env->NewGlobalRef(nioAccessClassLocal); 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jclass bufferClassLocal = _env->FindClass("java/nio/Buffer"); 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bufferClass = (jclass) _env->NewGlobalRef(bufferClassLocal); 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project getBasePointerID = _env->GetStaticMethodID(nioAccessClass, 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "getBasePointer", "(Ljava/nio/Buffer;)J"); 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project getBaseArrayID = _env->GetStaticMethodID(nioAccessClass, 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "getBaseArray", "(Ljava/nio/Buffer;)Ljava/lang/Object;"); 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project getBaseArrayOffsetID = _env->GetStaticMethodID(nioAccessClass, 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "getBaseArrayOffset", "(Ljava/nio/Buffer;)I"); 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project positionID = _env->GetFieldID(bufferClass, "position", "I"); 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project limitID = _env->GetFieldID(bufferClass, "limit", "I"); 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project elementSizeShiftID = 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project _env->GetFieldID(bufferClass, "_elementSizeShift", "I"); 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void * 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectgetPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining) 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jint position; 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jint limit; 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jint elementSizeShift; 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jlong pointer; 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jint offset; 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void *data; 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project position = _env->GetIntField(buffer, positionID); 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project limit = _env->GetIntField(buffer, limitID); 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID); 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *remaining = (limit - position) << elementSizeShift; 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pointer = _env->CallStaticLongMethod(nioAccessClass, 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project getBasePointerID, buffer); 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (pointer != 0L) { 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *array = NULL; 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (void *) (jint) pointer; 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 939875750593aae7c2a62f33c620809d49162393ebElliott Hughes 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *array = (jarray) _env->CallStaticObjectMethod(nioAccessClass, 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project getBaseArrayID, buffer); 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project offset = _env->CallStaticIntMethod(nioAccessClass, 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project getBaseArrayOffsetID, buffer); 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data = _env->GetPrimitiveArrayCritical(*array, (jboolean *) 0); 999875750593aae7c2a62f33c620809d49162393ebElliott Hughes 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (void *) ((char *) data + offset); 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectreleasePointer(JNIEnv *_env, jarray array, void *data, jboolean commit) 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project _env->ReleasePrimitiveArrayCritical(array, data, 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project commit ? 0 : JNI_ABORT); 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 11166089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevichstatic void * 11266089a33ea4efda711a3a5180f0b001bdac48dcfJack PalevichgetDirectBufferPointer(JNIEnv *_env, jobject buffer) { 11366089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich char* buf = (char*) _env->GetDirectBufferAddress(buffer); 11466089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich if (buf) { 11566089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich jint position = _env->GetIntField(buffer, positionID); 11666089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich jint elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID); 11766089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich buf += position << elementSizeShift; 11866089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich } else { 1199875750593aae7c2a62f33c620809d49162393ebElliott Hughes jniThrowException(_env, "java/lang/IllegalArgumentException", 1209875750593aae7c2a62f33c620809d49162393ebElliott Hughes "Must use a native order direct Buffer"); 12166089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich } 12266089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich return (void*) buf; 12366089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich} 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// -------------------------------------------------------------------------- 125