如何在使用Android NDK时测试当前的OpenGL ES上下文?

时间:2016-06-15 18:19:18

标签: opengl-es android-ndk egl

是否有一种简单的方法可以测试Android NDK中是否存在当前上下文?

如果在jni边界的java端绑定了EGL上下文,那么绑定在jni边界的本地端是否有效?反之亦然?如果绑定双向工作,我可以在边界的任何一侧发出GL命令,而不需要额外的逻辑吗?

指向边界两侧的上下文设置的示例代码的指针。不确定表面/ EGL交互在JNI方面的外观。

感谢。

1 个答案:

答案 0 :(得分:1)

要检查本机代码中是否存在当前上下文,您可以调用eglGetCurrentContext()

if (eglGetCurrentContext() != EGL_NO_CONTEXT) {
    // There is a current context.
}

是的,在JNI边界上的情境仍然存在。因此,如果您的Java代码中有当前上下文(例如,由GLSurfaceView管理),则可以进行JNI调用,然后在执行本机函数时进行OpenGL调用,而无需任何特殊考虑。我在这里更详细地回答了与此相关的问题:FrameBuffers with GLSurfaceView pattern in OpenGLES 1.1 on android ndk

没有充分理由说明相反的情况并非如此。您应该能够在本机代码中创建上下文,使其成为当前代码,并且在JNI调用返回后它应该仍然是Java代码中的最新代码。它似乎没那么有用,但如果你有充分的理由这样做,没有什么能阻止你。

如果您确实想在本机代码中创建上下文,我在这里的答案中发布了一个完整的示例:GLES10.glGetIntegerv returns 0 in Lollipop only

恕我直言,到目前为止,使用本机代码与OpenGL调用最简单的方法是使用GLSurfaceView,让它处理整个上下文创建和管理,并在{{1}的实现中进行JNI调用}。然后在本机代码中,您只需进行OpenGL调用,而无需担心上下文管理。