/* GLuint glCreateShaderProgramv ( GLenum type, GLsizei count, const GLchar *const *strings ) */
static jint
android_glCreateShaderProgramv
(JNIEnv *_env, jobject _this, jint type, jobjectArray strings) {
jint _exception = 0;
const char * _exceptionType = NULL;
const char * _exceptionMessage = NULL;
GLsizei _count;
const GLchar** _strings = NULL;
jstring* _jstrings = NULL;
GLuint _returnValue = 0;
if (!strings) {
_exception = 1;
_exceptionType = "java/lang/IllegalArgumentException";
_exceptionMessage = "strings == null";
goto exit;
}
_count = _env->GetArrayLength(strings);
_strings = (const GLchar**) calloc(_count, sizeof(const GLchar*));
if (!_strings) {
_exception = 1;
_exceptionType = "java/lang/OutOfMemoryError";
_exceptionMessage = "out of memory";
goto exit;
}
_jstrings = (jstring*) calloc(_count, sizeof(jstring));
if (!_jstrings) {
_exception = 1;
_exceptionType = "java/lang/OutOfMemoryError";
_exceptionMessage = "out of memory";
goto exit;
}
for(int i = 0; i < _count; i++) {
_jstrings[i] = (jstring) _env->GetObjectArrayElement(strings, i);
if (!_jstrings[i]) {
_exception = 1;
_exceptionType = "java/lang/IllegalArgumentException";
_exceptionMessage = "strings == null";
goto exit;
}
_strings[i] = _env->GetStringUTFChars(_jstrings[i], 0);
}
_returnValue = glCreateShaderProgramv((GLenum)type, _count, _strings);
exit:
if (_strings && _jstrings) {
for(int i = 0; i < _count; i++) {
if (_strings[i] && _jstrings[i]) {
_env->ReleaseStringUTFChars(_jstrings[i], _strings[i]);
}
}
}
if (_strings) {
free(_strings);
}
if (_jstrings) {
free(_jstrings);
}
if (_exception) {
jniThrowException(_env, _exceptionType, _exceptionMessage);
}
return (jint)_returnValue;
}