2

最近的 Android NDK r9 推出了对 OpenGL ES 3.0 的支持。有一个示例samples/gles3jni演示了如何从 JNI/native 代码中使用 OpenGL ES 3.0。可以通过两种不同的方式构建示例:

  • 与 API 级别 11 及更高版本兼容
  • 需要 API 级别 18 或更高版本。

两个版本都包含 OpenGL ES 2.0 后备路径,适用于不支持 OpenGL ES 3.0 的设备。但是,第一种情况下的示例使用LOCAL_LDLIBS选项静态链接到 OpenGL ES 2 -lGLESv2。在第二种情况下,它以相同的方式与 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();
}

如何完全省略静态链接并从中动态加载 GLES 2 或 3 .so

4

2 回答 2

2

在 API 18 及更高版本上,您可以使用 eglGetProcAddress 动态查询 ES 2.0 函数,就像示例中的 gl3stub.c 对 ES 3.0 函数所做的那样。在 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 版本上,链接它不应该有任何不利之处。

于 2013-10-17T17:39:38.533 回答
1

我没有4.3的设备来测试它,但我的理解是第一种方法实际上使用了GLES 3如果可用,所以它相当于动态链接libGLESv3。

与 libglesxx.so 的动态链接也是可能的,但是您没有快捷方式,并且必须对您使用的所有函数进行 dlsym。这不值得,恕我直言。

于 2013-07-28T19:42:58.600 回答