OSDN Git Service

Frequently used OpenGL ES methods whitelisted for fast JNI
authorDaniil Sokolov <dysokolo@intel.com>
Wed, 26 Aug 2015 19:39:36 +0000 (12:39 -0700)
committerChih-Wei Huang <cwhuang@linux.org.tw>
Wed, 20 Jul 2016 09:53:16 +0000 (17:53 +0800)
 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 <daniil.y.sokolov@intel.com>
Change-Id: I04ed94aef64686d6ee6a1b6a0ef62570687c5f5b
Reviewed-on: https://android.intel.com:443/405100

core/jni/android/opengl/util.cpp
core/jni/android_opengl_GLES20.cpp

index 40029bb..1bf861a 100644 (file)
@@ -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[] = {
index f9a0dfe..65331b0 100644 (file)
@@ -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)