69 lines
2.0 KiB
C++
69 lines
2.0 KiB
C++
/* 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;
|
|
}
|