【问题标题】:how to test that there is a current OpenGL ES context when using the Android NDK?使用 Android NDK 时如何测试是否存在当前的 OpenGL ES 上下文?
【发布时间】:2016-10-17 00:17:33
【问题描述】:

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

如果 EGL 上下文绑定在 jni 边界的 java 端,绑定在 jni 边界的本地端是否有效?反过来呢?如果绑定双向工作,我可以在边界的任一侧发出我认为合适的 GL 命令,而无需额外的逻辑吗?

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

谢谢。

【问题讨论】:

    标签: opengl-es android-ndk egl


    【解决方案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,让它处理整个上下文创建和管理,并在 Renderer 的实现中进行 JNI 调用。然后在本机代码中,您只需进行 OpenGL 调用,无需担心上下文管理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多