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

how to test that there is a current OpenGL ES context when using the Android NDK?

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

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

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

谢谢。

要检查本机代码中是否存在当前上下文,您可以调用 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 调用 returns 之后,它在您的 Java 代码中应该仍然是当前的。它似乎没那么有用,但如果你有充分的理由这样做,没有什么能阻止你。

如果您真的想在本机代码中创建上下文,我在此处的答案中发布了一个完整的示例来说明如何做到这一点:GLES10.glGetIntegerv returns 0 in Lollipop only

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