/* void glGetUniformIndices ( GLuint program, GLsizei uniformCount, const GLchar *const *uniformNames, GLuint *uniformIndices ) */ static void android_glGetUniformIndices_array (JNIEnv *_env, jobject _this, jint program, jobjectArray uniformNames_ref, jintArray uniformIndices_ref, jint uniformIndicesOffset) { jint _exception = 0; const char* _exceptionType = NULL; const char* _exceptionMessage = NULL; jint _count = 0; jint _i; const char** _names = NULL; GLuint* _indices_base = NULL; GLuint* _indices = NULL; if (!uniformNames_ref) { _exception = 1; _exceptionType = "java/lang/IllegalArgumentException"; _exceptionMessage = "uniformNames == null"; goto exit; } _count = _env->GetArrayLength(uniformNames_ref); _names = (const char**)calloc(_count, sizeof(const char*)); for (_i = 0; _i < _count; _i++) { jstring _name = (jstring)_env->GetObjectArrayElement(uniformNames_ref, _i); if (!_name) { _exception = 1; _exceptionType = "java/lang/IllegalArgumentException"; _exceptionMessage = "null uniformNames element"; goto exit; } _names[_i] = _env->GetStringUTFChars(_name, 0); } if (!uniformIndices_ref) { _exception = 1; _exceptionType = "java/lang/IllegalArgumentException"; _exceptionMessage = "uniformIndices == null"; goto exit; } if (uniformIndicesOffset < 0) { _exception = 1; _exceptionType = "java/lang/IllegalArgumentException"; _exceptionMessage = "uniformIndicesOffset < 0"; goto exit; } if (_env->GetArrayLength(uniformIndices_ref) - uniformIndicesOffset < _count) { _exception = 1; _exceptionType = "java/lang/IllegalArgumentException"; _exceptionMessage = "not enough space in uniformIndices"; goto exit; } _indices_base = (GLuint*)_env->GetIntArrayElements( uniformIndices_ref, 0); _indices = _indices_base + uniformIndicesOffset; glGetUniformIndices(program, _count, _names, _indices); exit: if (_indices_base) { _env->ReleaseIntArrayElements(uniformIndices_ref, (jint*)_indices_base, _exception ? JNI_ABORT : 0); } for (_i = _count - 1; _i >= 0; _i--) { if (_names[_i]) { jstring _name = (jstring)_env->GetObjectArrayElement(uniformNames_ref, _i); if (_name) { _env->ReleaseStringUTFChars(_name, _names[_i]); } } } free(_names); if (_exception) { jniThrowException(_env, _exceptionType, _exceptionMessage); } } /* void glGetUniformIndices ( GLuint program, GLsizei uniformCount, const GLchar *const *uniformNames, GLuint *uniformIndices ) */ static void android_glGetUniformIndices_buffer (JNIEnv *_env, jobject _this, jint program, jobjectArray uniformNames_ref, jobject uniformIndices_buf) { jint _exception = 0; const char* _exceptionType = NULL; const char* _exceptionMessage = NULL; jint _count = 0; jint _i; const char** _names = NULL; jintArray _uniformIndicesArray = (jintArray)0; jint _uniformIndicesRemaining; jint _uniformIndicesOffset = 0; GLuint* _indices = NULL; char* _indicesBase = NULL; if (!uniformNames_ref) { _exception = 1; _exceptionType = "java/lang/IllegalArgumentException"; _exceptionMessage = "uniformNames == null"; goto exit; } if (!uniformIndices_buf) { _exception = 1; _exceptionType = "java/lang/IllegalArgumentException"; _exceptionMessage = "uniformIndices == null"; goto exit; } _count = _env->GetArrayLength(uniformNames_ref); _names = (const char**)calloc(_count, sizeof(const char*)); for (_i = 0; _i < _count; _i++) { jstring _name = (jstring)_env->GetObjectArrayElement(uniformNames_ref, _i); if (!_name) { _exception = 1; _exceptionType = "java/lang/IllegalArgumentException"; _exceptionMessage = "null uniformNames element"; goto exit; } _names[_i] = _env->GetStringUTFChars(_name, 0); } _indices = (GLuint*)getPointer(_env, uniformIndices_buf, (jarray*)&_uniformIndicesArray, &_uniformIndicesRemaining, &_uniformIndicesOffset); if (!_indices) { _indicesBase = (char*)_env->GetIntArrayElements( _uniformIndicesArray, 0); _indices = (GLuint*)(_indicesBase + _uniformIndicesOffset); } if (_uniformIndicesRemaining < _count) { _exception = 1; _exceptionType = "java/lang/IllegalArgumentException"; _exceptionMessage = "not enough space in uniformIndices"; goto exit; } glGetUniformIndices(program, _count, _names, _indices); exit: if (_uniformIndicesArray) { releaseArrayPointer<jintArray, jint*, IntArrayReleaser>( _env, _uniformIndicesArray, (jint*)_indicesBase, JNI_TRUE); } for (_i = _count - 1; _i >= 0; _i--) { if (_names[_i]) { jstring _name = (jstring)_env->GetObjectArrayElement(uniformNames_ref, _i); if (_name) { _env->ReleaseStringUTFChars(_name, _names[_i]); } } } free(_names); if (_exception) { jniThrowException(_env, _exceptionType, _exceptionMessage); } }