From: Daniil Sokolov Date: Wed, 26 Aug 2015 19:39:36 +0000 (-0700) Subject: Frequently used OpenGL ES methods whitelisted for fast JNI X-Git-Tag: android-x86-6.0-r1~5^2~42 X-Git-Url: http://git.osdn.net/view?p=android-x86%2Fframeworks-base.git;a=commitdiff_plain;h=5d85d86b6e3d748f17f82f9e7248943c30d84f11 Frequently used OpenGL ES methods whitelisted for fast JNI path The patch lists ~70 methods of OpenGL ES 2.0 wrapper as fast JNI. This significantly reduces JNI overhead for OpenGL Java applications. Which results in faster rendering and reduced JANK (e. g. 10 % Jank reduction on Google Maps). None of the whitelisted methods can block forever according to OpenGL spec. So, this change is safe from fastJNI point of view (can not introduce any deadlocks). As measured is a separate experiemnt the whitelisted methods take less than 1 ms in vast majority (99.9+) of the cases, and always complete within 100 ms. As shown in this thread https://soco.intel.com/thread/766188 such level of delays should not have any practical impact on GC pauses, but reduces the JNI overhead significantly. Category:aosp improvement Domain:AOSP.ART-Other Origin: internal Upstream-Candidate: yes Tracked-On: https://jira01.devtools.intel.com/browse/OAM-3965 Signed-off-by: DaniilSokolov Change-Id: I04ed94aef64686d6ee6a1b6a0ef62570687c5f5b Reviewed-on: https://android.intel.com:443/405100 --- diff --git a/core/jni/android/opengl/util.cpp b/core/jni/android/opengl/util.cpp index 40029bbe0aee..1bf861a8c564 100644 --- a/core/jni/android/opengl/util.cpp +++ b/core/jni/android/opengl/util.cpp @@ -1088,8 +1088,8 @@ static jint etc1_getHeight(JNIEnv *env, jclass clazz, */ static JNINativeMethod gMatrixMethods[] = { - { "multiplyMM", "([FI[FI[FI)V", (void*)util_multiplyMM }, - { "multiplyMV", "([FI[FI[FI)V", (void*)util_multiplyMV }, + { "multiplyMM", "!([FI[FI[FI)V", (void*)util_multiplyMM }, + { "multiplyMV", "!([FI[FI[FI)V", (void*)util_multiplyMV }, }; static JNINativeMethod gVisibilityMethods[] = { diff --git a/core/jni/android_opengl_GLES20.cpp b/core/jni/android_opengl_GLES20.cpp index f9a0dfeb444c..65331b030507 100644 --- a/core/jni/android_opengl_GLES20.cpp +++ b/core/jni/android_opengl_GLES20.cpp @@ -6154,14 +6154,14 @@ static const char *classPathName = "android/opengl/GLES20"; static JNINativeMethod methods[] = { {"_nativeClassInit", "()V", (void*)nativeClassInit }, -{"glActiveTexture", "(I)V", (void *) android_glActiveTexture__I }, +{"glActiveTexture", "!(I)V", (void *) android_glActiveTexture__I }, {"glAttachShader", "(II)V", (void *) android_glAttachShader__II }, {"glBindAttribLocation", "(IILjava/lang/String;)V", (void *) android_glBindAttribLocation__IILjava_lang_String_2 }, -{"glBindBuffer", "(II)V", (void *) android_glBindBuffer__II }, +{"glBindBuffer", "!(II)V", (void *) android_glBindBuffer__II }, {"glBindFramebuffer", "(II)V", (void *) android_glBindFramebuffer__II }, {"glBindRenderbuffer", "(II)V", (void *) android_glBindRenderbuffer__II }, -{"glBindTexture", "(II)V", (void *) android_glBindTexture__II }, -{"glBlendColor", "(FFFF)V", (void *) android_glBlendColor__FFFF }, +{"glBindTexture", "!(II)V", (void *) android_glBindTexture__II }, +{"glBlendColor", "!(FFFF)V", (void *) android_glBlendColor__FFFF }, {"glBlendEquation", "(I)V", (void *) android_glBlendEquation__I }, {"glBlendEquationSeparate", "(II)V", (void *) android_glBlendEquationSeparate__II }, {"glBlendFunc", "(II)V", (void *) android_glBlendFunc__II }, @@ -6171,9 +6171,9 @@ static JNINativeMethod methods[] = { {"glCheckFramebufferStatus", "(I)I", (void *) android_glCheckFramebufferStatus__I }, {"glClear", "(I)V", (void *) android_glClear__I }, {"glClearColor", "(FFFF)V", (void *) android_glClearColor__FFFF }, -{"glClearDepthf", "(F)V", (void *) android_glClearDepthf__F }, -{"glClearStencil", "(I)V", (void *) android_glClearStencil__I }, -{"glColorMask", "(ZZZZ)V", (void *) android_glColorMask__ZZZZ }, +{"glClearDepthf", "!(F)V", (void *) android_glClearDepthf__F }, +{"glClearStencil", "!(I)V", (void *) android_glClearStencil__I }, +{"glColorMask", "!(ZZZZ)V", (void *) android_glColorMask__ZZZZ }, {"glCompileShader", "(I)V", (void *) android_glCompileShader__I }, {"glCompressedTexImage2D", "(IIIIIIILjava/nio/Buffer;)V", (void *) android_glCompressedTexImage2D__IIIIIIILjava_nio_Buffer_2 }, {"glCompressedTexSubImage2D", "(IIIIIIIILjava/nio/Buffer;)V", (void *) android_glCompressedTexSubImage2D__IIIIIIIILjava_nio_Buffer_2 }, @@ -6181,7 +6181,7 @@ static JNINativeMethod methods[] = { {"glCopyTexSubImage2D", "(IIIIIIII)V", (void *) android_glCopyTexSubImage2D__IIIIIIII }, {"glCreateProgram", "()I", (void *) android_glCreateProgram__ }, {"glCreateShader", "(I)I", (void *) android_glCreateShader__I }, -{"glCullFace", "(I)V", (void *) android_glCullFace__I }, +{"glCullFace", "!(I)V", (void *) android_glCullFace__I }, {"glDeleteBuffers", "(I[II)V", (void *) android_glDeleteBuffers__I_3II }, {"glDeleteBuffers", "(ILjava/nio/IntBuffer;)V", (void *) android_glDeleteBuffers__ILjava_nio_IntBuffer_2 }, {"glDeleteFramebuffers", "(I[II)V", (void *) android_glDeleteFramebuffers__I_3II }, @@ -6192,22 +6192,22 @@ static JNINativeMethod methods[] = { {"glDeleteShader", "(I)V", (void *) android_glDeleteShader__I }, {"glDeleteTextures", "(I[II)V", (void *) android_glDeleteTextures__I_3II }, {"glDeleteTextures", "(ILjava/nio/IntBuffer;)V", (void *) android_glDeleteTextures__ILjava_nio_IntBuffer_2 }, -{"glDepthFunc", "(I)V", (void *) android_glDepthFunc__I }, -{"glDepthMask", "(Z)V", (void *) android_glDepthMask__Z }, +{"glDepthFunc", "!(I)V", (void *) android_glDepthFunc__I }, +{"glDepthMask", "!(Z)V", (void *) android_glDepthMask__Z }, {"glDepthRangef", "(FF)V", (void *) android_glDepthRangef__FF }, {"glDetachShader", "(II)V", (void *) android_glDetachShader__II }, -{"glDisable", "(I)V", (void *) android_glDisable__I }, -{"glDisableVertexAttribArray", "(I)V", (void *) android_glDisableVertexAttribArray__I }, -{"glDrawArrays", "(III)V", (void *) android_glDrawArrays__III }, -{"glDrawElements", "(IIII)V", (void *) android_glDrawElements__IIII }, -{"glDrawElements", "(IIILjava/nio/Buffer;)V", (void *) android_glDrawElements__IIILjava_nio_Buffer_2 }, -{"glEnable", "(I)V", (void *) android_glEnable__I }, -{"glEnableVertexAttribArray", "(I)V", (void *) android_glEnableVertexAttribArray__I }, +{"glDisable", "!(I)V", (void *) android_glDisable__I }, +{"glDisableVertexAttribArray", "!(I)V", (void *) android_glDisableVertexAttribArray__I }, +{"glDrawArrays", "!(III)V", (void *) android_glDrawArrays__III }, +{"glDrawElements", "!(IIII)V", (void *) android_glDrawElements__IIII }, +{"glDrawElements", "!(IIILjava/nio/Buffer;)V", (void *) android_glDrawElements__IIILjava_nio_Buffer_2 }, +{"glEnable", "!(I)V", (void *) android_glEnable__I }, +{"glEnableVertexAttribArray", "!(I)V", (void *) android_glEnableVertexAttribArray__I }, {"glFinish", "()V", (void *) android_glFinish__ }, {"glFlush", "()V", (void *) android_glFlush__ }, {"glFramebufferRenderbuffer", "(IIII)V", (void *) android_glFramebufferRenderbuffer__IIII }, {"glFramebufferTexture2D", "(IIIII)V", (void *) android_glFramebufferTexture2D__IIIII }, -{"glFrontFace", "(I)V", (void *) android_glFrontFace__I }, +{"glFrontFace", "!(I)V", (void *) android_glFrontFace__I }, {"glGenBuffers", "(I[II)V", (void *) android_glGenBuffers__I_3II }, {"glGenBuffers", "(ILjava/nio/IntBuffer;)V", (void *) android_glGenBuffers__ILjava_nio_IntBuffer_2 }, {"glGenerateMipmap", "(I)V", (void *) android_glGenerateMipmap__I }, @@ -6232,12 +6232,12 @@ static JNINativeMethod methods[] = { {"glGetBooleanv", "(ILjava/nio/IntBuffer;)V", (void *) android_glGetBooleanv__ILjava_nio_IntBuffer_2 }, {"glGetBufferParameteriv", "(II[II)V", (void *) android_glGetBufferParameteriv__II_3II }, {"glGetBufferParameteriv", "(IILjava/nio/IntBuffer;)V", (void *) android_glGetBufferParameteriv__IILjava_nio_IntBuffer_2 }, -{"glGetError", "()I", (void *) android_glGetError__ }, -{"glGetFloatv", "(I[FI)V", (void *) android_glGetFloatv__I_3FI }, +{"glGetError", "!()I", (void *) android_glGetError__ }, +{"glGetFloatv", "!(I[FI)V", (void *) android_glGetFloatv__I_3FI }, {"glGetFloatv", "(ILjava/nio/FloatBuffer;)V", (void *) android_glGetFloatv__ILjava_nio_FloatBuffer_2 }, {"glGetFramebufferAttachmentParameteriv", "(III[II)V", (void *) android_glGetFramebufferAttachmentParameteriv__III_3II }, {"glGetFramebufferAttachmentParameteriv", "(IIILjava/nio/IntBuffer;)V", (void *) android_glGetFramebufferAttachmentParameteriv__IIILjava_nio_IntBuffer_2 }, -{"glGetIntegerv", "(I[II)V", (void *) android_glGetIntegerv__I_3II }, +{"glGetIntegerv", "!(I[II)V", (void *) android_glGetIntegerv__I_3II }, {"glGetIntegerv", "(ILjava/nio/IntBuffer;)V", (void *) android_glGetIntegerv__ILjava_nio_IntBuffer_2 }, {"glGetProgramiv", "(II[II)V", (void *) android_glGetProgramiv__II_3II }, {"glGetProgramiv", "(IILjava/nio/IntBuffer;)V", (void *) android_glGetProgramiv__IILjava_nio_IntBuffer_2 }, @@ -6282,16 +6282,16 @@ static JNINativeMethod methods[] = { {"glReleaseShaderCompiler", "()V", (void *) android_glReleaseShaderCompiler__ }, {"glRenderbufferStorage", "(IIII)V", (void *) android_glRenderbufferStorage__IIII }, {"glSampleCoverage", "(FZ)V", (void *) android_glSampleCoverage__FZ }, -{"glScissor", "(IIII)V", (void *) android_glScissor__IIII }, +{"glScissor", "!(IIII)V", (void *) android_glScissor__IIII }, {"glShaderBinary", "(I[IIILjava/nio/Buffer;I)V", (void *) android_glShaderBinary__I_3IIILjava_nio_Buffer_2I }, {"glShaderBinary", "(ILjava/nio/IntBuffer;ILjava/nio/Buffer;I)V", (void *) android_glShaderBinary__ILjava_nio_IntBuffer_2ILjava_nio_Buffer_2I }, {"glShaderSource", "(ILjava/lang/String;)V", (void *) android_glShaderSource }, -{"glStencilFunc", "(III)V", (void *) android_glStencilFunc__III }, -{"glStencilFuncSeparate", "(IIII)V", (void *) android_glStencilFuncSeparate__IIII }, -{"glStencilMask", "(I)V", (void *) android_glStencilMask__I }, -{"glStencilMaskSeparate", "(II)V", (void *) android_glStencilMaskSeparate__II }, -{"glStencilOp", "(III)V", (void *) android_glStencilOp__III }, -{"glStencilOpSeparate", "(IIII)V", (void *) android_glStencilOpSeparate__IIII }, +{"glStencilFunc", "!(III)V", (void *) android_glStencilFunc__III }, +{"glStencilFuncSeparate", "!(IIII)V", (void *) android_glStencilFuncSeparate__IIII }, +{"glStencilMask", "!(I)V", (void *) android_glStencilMask__I }, +{"glStencilMaskSeparate", "!(II)V", (void *) android_glStencilMaskSeparate__II }, +{"glStencilOp", "!(III)V", (void *) android_glStencilOp__III }, +{"glStencilOpSeparate", "!(IIII)V", (void *) android_glStencilOpSeparate__IIII }, {"glTexImage2D", "(IIIIIIIILjava/nio/Buffer;)V", (void *) android_glTexImage2D__IIIIIIIILjava_nio_Buffer_2 }, {"glTexParameterf", "(IIF)V", (void *) android_glTexParameterf__IIF }, {"glTexParameterfv", "(II[FI)V", (void *) android_glTexParameterfv__II_3FI }, @@ -6300,53 +6300,53 @@ static JNINativeMethod methods[] = { {"glTexParameteriv", "(II[II)V", (void *) android_glTexParameteriv__II_3II }, {"glTexParameteriv", "(IILjava/nio/IntBuffer;)V", (void *) android_glTexParameteriv__IILjava_nio_IntBuffer_2 }, {"glTexSubImage2D", "(IIIIIIIILjava/nio/Buffer;)V", (void *) android_glTexSubImage2D__IIIIIIIILjava_nio_Buffer_2 }, -{"glUniform1f", "(IF)V", (void *) android_glUniform1f__IF }, -{"glUniform1fv", "(II[FI)V", (void *) android_glUniform1fv__II_3FI }, -{"glUniform1fv", "(IILjava/nio/FloatBuffer;)V", (void *) android_glUniform1fv__IILjava_nio_FloatBuffer_2 }, -{"glUniform1i", "(II)V", (void *) android_glUniform1i__II }, -{"glUniform1iv", "(II[II)V", (void *) android_glUniform1iv__II_3II }, -{"glUniform1iv", "(IILjava/nio/IntBuffer;)V", (void *) android_glUniform1iv__IILjava_nio_IntBuffer_2 }, -{"glUniform2f", "(IFF)V", (void *) android_glUniform2f__IFF }, -{"glUniform2fv", "(II[FI)V", (void *) android_glUniform2fv__II_3FI }, -{"glUniform2fv", "(IILjava/nio/FloatBuffer;)V", (void *) android_glUniform2fv__IILjava_nio_FloatBuffer_2 }, -{"glUniform2i", "(III)V", (void *) android_glUniform2i__III }, -{"glUniform2iv", "(II[II)V", (void *) android_glUniform2iv__II_3II }, -{"glUniform2iv", "(IILjava/nio/IntBuffer;)V", (void *) android_glUniform2iv__IILjava_nio_IntBuffer_2 }, -{"glUniform3f", "(IFFF)V", (void *) android_glUniform3f__IFFF }, -{"glUniform3fv", "(II[FI)V", (void *) android_glUniform3fv__II_3FI }, -{"glUniform3fv", "(IILjava/nio/FloatBuffer;)V", (void *) android_glUniform3fv__IILjava_nio_FloatBuffer_2 }, -{"glUniform3i", "(IIII)V", (void *) android_glUniform3i__IIII }, -{"glUniform3iv", "(II[II)V", (void *) android_glUniform3iv__II_3II }, -{"glUniform3iv", "(IILjava/nio/IntBuffer;)V", (void *) android_glUniform3iv__IILjava_nio_IntBuffer_2 }, -{"glUniform4f", "(IFFFF)V", (void *) android_glUniform4f__IFFFF }, -{"glUniform4fv", "(II[FI)V", (void *) android_glUniform4fv__II_3FI }, -{"glUniform4fv", "(IILjava/nio/FloatBuffer;)V", (void *) android_glUniform4fv__IILjava_nio_FloatBuffer_2 }, -{"glUniform4i", "(IIIII)V", (void *) android_glUniform4i__IIIII }, -{"glUniform4iv", "(II[II)V", (void *) android_glUniform4iv__II_3II }, -{"glUniform4iv", "(IILjava/nio/IntBuffer;)V", (void *) android_glUniform4iv__IILjava_nio_IntBuffer_2 }, -{"glUniformMatrix2fv", "(IIZ[FI)V", (void *) android_glUniformMatrix2fv__IIZ_3FI }, -{"glUniformMatrix2fv", "(IIZLjava/nio/FloatBuffer;)V", (void *) android_glUniformMatrix2fv__IIZLjava_nio_FloatBuffer_2 }, -{"glUniformMatrix3fv", "(IIZ[FI)V", (void *) android_glUniformMatrix3fv__IIZ_3FI }, -{"glUniformMatrix3fv", "(IIZLjava/nio/FloatBuffer;)V", (void *) android_glUniformMatrix3fv__IIZLjava_nio_FloatBuffer_2 }, -{"glUniformMatrix4fv", "(IIZ[FI)V", (void *) android_glUniformMatrix4fv__IIZ_3FI }, -{"glUniformMatrix4fv", "(IIZLjava/nio/FloatBuffer;)V", (void *) android_glUniformMatrix4fv__IIZLjava_nio_FloatBuffer_2 }, -{"glUseProgram", "(I)V", (void *) android_glUseProgram__I }, +{"glUniform1f", "!(IF)V", (void *) android_glUniform1f__IF }, +{"glUniform1fv", "!(II[FI)V", (void *) android_glUniform1fv__II_3FI }, +{"glUniform1fv", "!(IILjava/nio/FloatBuffer;)V", (void *) android_glUniform1fv__IILjava_nio_FloatBuffer_2 }, +{"glUniform1i", "!(II)V", (void *) android_glUniform1i__II }, +{"glUniform1iv", "!(II[II)V", (void *) android_glUniform1iv__II_3II }, +{"glUniform1iv", "!(IILjava/nio/IntBuffer;)V", (void *) android_glUniform1iv__IILjava_nio_IntBuffer_2 }, +{"glUniform2f", "!(IFF)V", (void *) android_glUniform2f__IFF }, +{"glUniform2fv", "!(II[FI)V", (void *) android_glUniform2fv__II_3FI }, +{"glUniform2fv", "!(IILjava/nio/FloatBuffer;)V", (void *) android_glUniform2fv__IILjava_nio_FloatBuffer_2 }, +{"glUniform2i", "!(III)V", (void *) android_glUniform2i__III }, +{"glUniform2iv", "!(II[II)V", (void *) android_glUniform2iv__II_3II }, +{"glUniform2iv", "!(IILjava/nio/IntBuffer;)V", (void *) android_glUniform2iv__IILjava_nio_IntBuffer_2 }, +{"glUniform3f", "!(IFFF)V", (void *) android_glUniform3f__IFFF }, +{"glUniform3fv", "!(II[FI)V", (void *) android_glUniform3fv__II_3FI }, +{"glUniform3fv", "!(IILjava/nio/FloatBuffer;)V", (void *) android_glUniform3fv__IILjava_nio_FloatBuffer_2 }, +{"glUniform3i", "!(IIII)V", (void *) android_glUniform3i__IIII }, +{"glUniform3iv", "!(II[II)V", (void *) android_glUniform3iv__II_3II }, +{"glUniform3iv", "!(IILjava/nio/IntBuffer;)V", (void *) android_glUniform3iv__IILjava_nio_IntBuffer_2 }, +{"glUniform4f", "!(IFFFF)V", (void *) android_glUniform4f__IFFFF }, +{"glUniform4fv", "!(II[FI)V", (void *) android_glUniform4fv__II_3FI }, +{"glUniform4fv", "!(IILjava/nio/FloatBuffer;)V", (void *) android_glUniform4fv__IILjava_nio_FloatBuffer_2 }, +{"glUniform4i", "!(IIIII)V", (void *) android_glUniform4i__IIIII }, +{"glUniform4iv", "!(II[II)V", (void *) android_glUniform4iv__II_3II }, +{"glUniform4iv", "!(IILjava/nio/IntBuffer;)V", (void *) android_glUniform4iv__IILjava_nio_IntBuffer_2 }, +{"glUniformMatrix2fv", "!(IIZ[FI)V", (void *) android_glUniformMatrix2fv__IIZ_3FI }, +{"glUniformMatrix2fv", "!(IIZLjava/nio/FloatBuffer;)V", (void *) android_glUniformMatrix2fv__IIZLjava_nio_FloatBuffer_2 }, +{"glUniformMatrix3fv", "!(IIZ[FI)V", (void *) android_glUniformMatrix3fv__IIZ_3FI }, +{"glUniformMatrix3fv", "!(IIZLjava/nio/FloatBuffer;)V", (void *) android_glUniformMatrix3fv__IIZLjava_nio_FloatBuffer_2 }, +{"glUniformMatrix4fv", "!(IIZ[FI)V", (void *) android_glUniformMatrix4fv__IIZ_3FI }, +{"glUniformMatrix4fv", "!(IIZLjava/nio/FloatBuffer;)V", (void *) android_glUniformMatrix4fv__IIZLjava_nio_FloatBuffer_2 }, +{"glUseProgram", "!(I)V", (void *) android_glUseProgram__I }, {"glValidateProgram", "(I)V", (void *) android_glValidateProgram__I }, -{"glVertexAttrib1f", "(IF)V", (void *) android_glVertexAttrib1f__IF }, -{"glVertexAttrib1fv", "(I[FI)V", (void *) android_glVertexAttrib1fv__I_3FI }, -{"glVertexAttrib1fv", "(ILjava/nio/FloatBuffer;)V", (void *) android_glVertexAttrib1fv__ILjava_nio_FloatBuffer_2 }, -{"glVertexAttrib2f", "(IFF)V", (void *) android_glVertexAttrib2f__IFF }, -{"glVertexAttrib2fv", "(I[FI)V", (void *) android_glVertexAttrib2fv__I_3FI }, -{"glVertexAttrib2fv", "(ILjava/nio/FloatBuffer;)V", (void *) android_glVertexAttrib2fv__ILjava_nio_FloatBuffer_2 }, -{"glVertexAttrib3f", "(IFFF)V", (void *) android_glVertexAttrib3f__IFFF }, -{"glVertexAttrib3fv", "(I[FI)V", (void *) android_glVertexAttrib3fv__I_3FI }, -{"glVertexAttrib3fv", "(ILjava/nio/FloatBuffer;)V", (void *) android_glVertexAttrib3fv__ILjava_nio_FloatBuffer_2 }, -{"glVertexAttrib4f", "(IFFFF)V", (void *) android_glVertexAttrib4f__IFFFF }, -{"glVertexAttrib4fv", "(I[FI)V", (void *) android_glVertexAttrib4fv__I_3FI }, -{"glVertexAttrib4fv", "(ILjava/nio/FloatBuffer;)V", (void *) android_glVertexAttrib4fv__ILjava_nio_FloatBuffer_2 }, -{"glVertexAttribPointer", "(IIIZII)V", (void *) android_glVertexAttribPointer__IIIZII }, -{"glVertexAttribPointerBounds", "(IIIZILjava/nio/Buffer;I)V", (void *) android_glVertexAttribPointerBounds__IIIZILjava_nio_Buffer_2I }, -{"glViewport", "(IIII)V", (void *) android_glViewport__IIII }, +{"glVertexAttrib1f", "!(IF)V", (void *) android_glVertexAttrib1f__IF }, +{"glVertexAttrib1fv", "!(I[FI)V", (void *) android_glVertexAttrib1fv__I_3FI }, +{"glVertexAttrib1fv", "!(ILjava/nio/FloatBuffer;)V", (void *) android_glVertexAttrib1fv__ILjava_nio_FloatBuffer_2 }, +{"glVertexAttrib2f", "!(IFF)V", (void *) android_glVertexAttrib2f__IFF }, +{"glVertexAttrib2fv", "!(I[FI)V", (void *) android_glVertexAttrib2fv__I_3FI }, +{"glVertexAttrib2fv", "!(ILjava/nio/FloatBuffer;)V", (void *) android_glVertexAttrib2fv__ILjava_nio_FloatBuffer_2 }, +{"glVertexAttrib3f", "!(IFFF)V", (void *) android_glVertexAttrib3f__IFFF }, +{"glVertexAttrib3fv", "!(I[FI)V", (void *) android_glVertexAttrib3fv__I_3FI }, +{"glVertexAttrib3fv", "!(ILjava/nio/FloatBuffer;)V", (void *) android_glVertexAttrib3fv__ILjava_nio_FloatBuffer_2 }, +{"glVertexAttrib4f", "!(IFFFF)V", (void *) android_glVertexAttrib4f__IFFFF }, +{"glVertexAttrib4fv", "!(I[FI)V", (void *) android_glVertexAttrib4fv__I_3FI }, +{"glVertexAttrib4fv", "!(ILjava/nio/FloatBuffer;)V", (void *) android_glVertexAttrib4fv__ILjava_nio_FloatBuffer_2 }, +{"glVertexAttribPointer", "!(IIIZII)V", (void *) android_glVertexAttribPointer__IIIZII }, +{"glVertexAttribPointerBounds", "!(IIIZILjava/nio/Buffer;I)V", (void *) android_glVertexAttribPointerBounds__IIIZILjava_nio_Buffer_2I }, +{"glViewport", "!(IIII)V", (void *) android_glViewport__IIII }, }; int register_android_opengl_jni_GLES20(JNIEnv *_env)