最近的Android NDK r9推出了对OpenGL ES 3.0的支持。有一个示例samples/gles3jni
演示了如何从JNI /本机代码中使用OpenGL ES 3.0。样本可以通过两种不同的方式构建:
这两个版本都包含一个OpenGL ES 2.0回退路径,适用于不支持OpenGL ES 3.0的设备。但是,在第一个案例中,使用LOCAL_LDLIBS
选项-lGLESv2
静态链接到OpenGL ES 2。在第二种情况下,它以相同的方式与GLES 3静态链接。
初始化如下:
const char* versionStr = (const char*)glGetString(GL_VERSION);
if (strstr(versionStr, "OpenGL ES 3.") && gl3stubInit()) {
g_renderer = createES3Renderer();
} else if (strstr(versionStr, "OpenGL ES 2.")) {
g_renderer = createES2Renderer();
}
如何省略静态链接并从.so
动态加载GLES 2或3?
答案 0 :(得分:1)
我没有4.3设备来测试它,但我的理解是第一种方法实际上使用了GLES 3(如果可用),所以它相当于动态链接libGLESv3。
也可以使用libglesxx.so动态链接,但是你没有快捷方式,并且必须使用你所使用的所有函数。这不值得,恕我直言。
答案 1 :(得分:1)
在API 18及更高版本中,您可以使用eglGetProcAddress动态查询ES 2.0函数,就像ES 3.0函数示例中的gl3stub.c一样。在API 18之前,您需要执行以下操作:
// global scope, probably a header file
extern GL_APICALL const GLubyte* (* GL_APIENTRY glGetString) (GLenum name);
extern GL_APICALL GLenum (* GL_APIENTRY glGetError) (void);
...
// initialization code
void* libGLESv2 = dlopen("libGLESv2.so", RTLD_GLOBAL | RTLD_NOW);
glGetString = dlsym(libGLESv2, "glGetString");
glGetError = dlsym(libGLESv2, "glGetError");
...
当然,在dlopen和dlsym调用上添加错误检查。
但是,我不确定你为什么要这样做。 libGLESv2.so出现在您可能想要定位的任何Android版本上,不应该有任何不利的链接。