Чтобы проверить, есть ли текущий контекст в нативном коде, вы можете вызвать eglGetCurrentContext()
:
if (eglGetCurrentContext() != EGL_NO_CONTEXT) {
// There is a current context.
}
Да, контексты остаются текущими за пределами JNI. Поэтому, если у вас есть текущий контекст в вашем коде Java (например, управляемый GLSurfaceView
), вы можете делать вызовы JNI, а затем делать вызовы OpenGL в реализации нативной функции без какого-либо специального рассмотрения. Я ответил на вопрос, связанный с этим, более подробно здесь: FrameBuffers с шаблоном GLSurfaceView в OpenGLES 1.1 на android ndk.
Нет веской причины, по которой обратное не было бы правдой. Вы должны иметь возможность создать контекст в собственном коде, сделать его текущим, и он должен оставаться актуальным в вашем Java-коде после возврата вызова JNI. Это кажется гораздо менее полезным, но если у вас есть для этого веская причина, ничто не должно вас останавливать.
Если вы действительно хотите создавать контексты в собственном коде, я разместил полный пример того, как это сделать, в ответе здесь: GLES10.glGetIntegerv возвращает 0 только в Lollipop.
ИМХО, безусловно, самый простой способ использовать собственный код с вызовами OpenGL — это использовать GLSurfaceView
, позволить ему обрабатывать все создание и управление контекстом и выполнять вызовы JNI в реализации Renderer
. Затем в нативном коде вы просто выполняете вызовы OpenGL, не беспокоясь об управлении контекстом.
person
Reto Koradi
schedule
16.06.2016