web-dev-qa-db-ja.com

eglCreateWindowSurface:native_window_api_connectが失敗しました

Android:hardwareAcceleratedがマニフェストファイルにfalseに設定されている場合、最新のSamsung Galaxyシリーズでのみ発生するという問題があります

私の知る限り(自分で試した)、Galaxy S9、J6、Note 8で発生しますが、たとえばGalaxyS8では発生しません。他の電話はまったく影響を受けていないようです。

問題は、何も表示されない(黒い画面)GLSurfaceViewを取得したことですが、アクティビティを切り替えると、エラーなしでビューが更新されるため、再び機能し始めます。

これは私が見つけた疑わしいログ行です

01-13 14:39:47.813 25013 25080 E libEGL  : eglCreateWindowSurface: native_window_api_connect (win=0xc166b808) failed (0xffffffed) (already connected to another API?)
01-13 14:39:47.813 25013 25080 E libEGL  : eglCreateWindowSurface:679 error 3003 (EGL_BAD_ALLOC)

これらは私のコードの重要な部分です:

GLSurf glsurf;

public void onPause() {
    super.onPause();

    // stop
    if (glsurf != null) {
        glsurf.onPause();
    }
}

@Override
public void onResume() {
    super.onResume();

    if (glsurf != null)
        glsurf.onResume();
}

public class GLSurf extends GLSurfaceView {

    public GLSurf(Context context) {
        super(context);

        /* Create an OpenGL ES 2.0 context. */
        setEGLContextClientVersion(2);
        setEGLConfigChooser(8, 8, 8, 8, 16, 0);

        // Set the Renderer for drawing on the GLSurfaceView
        mRenderer = new GLRenderer(context);
        setRenderer(mRenderer);

        setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);
    }
}

public class GLRenderer implements Renderer {

    GLRenderer(Context c){
        // does nothing
    }

    @Override
    public void onDrawFrame(GL10 unused) {

        // i've copied it but it's not even reached

        // call jni function updating the single texture filling the screen
        nativeGLRender();

        // Draw the triangles
        GLES20.glDrawElements(GLES20.GL_TRIANGLES, indices.length,
                GLES20.GL_UNSIGNED_SHORT, drawListBuffer);
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {

        // We need to know the current width and height.
        mScreenWidth = width;
        mScreenHeight = height;

        // Redo the Viewport.
        GLES20.glViewport(0, 0, (int)mScreenWidth, (int)mScreenHeight);

    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {

        // Set the clear color to black
        GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1);
    }

}

いくつかの情報詳細:

eGL_BAD_ALLOCは、意味のある(少なくとも私が思うに)ログを持つこの一連のイベントの後に常に発生します

onCreate
onResume
onPause

GLSurfaceView: Warning, !readyToDraw() but waiting for draw finished! Early reporting draw finished.

onResume 

libEGL  : eglCreateWindowSurface: native_window_api_connect (win=0xc166b808) failed (0xffffffed) (already connected to another API?)
libEGL  : eglCreateWindowSurface:679 error 3003 (EGL_BAD_ALLOC)

onPause
onStop
onDestroy
onCreate 
onResume
onSurfaceCreated

        : NULL == surf->write_back_color_buffer
        : NULL == surf->write_back_color_buffer
GLThread: eglSwapBuffers failed: EGL_BAD_SURFACE

... black screen ...

上記のイベントは、ユーザーの操作なしで1〜2秒の間に発生することに注意してください。何が起こっているのかについて何か考えはありますか?

情報を完成させるために、以下は動作中の電話のシーケンスです(例:私のネクサス6)

onCreate
onResume
onSurfaceCreated
... working screen

1月16日編集:

この問題に関する新しい情報:

  • アプリを初めて起動すると、動作します
  • 次の試みに取り組むことはありません
  • バックグラウンドに置いて復元すると機能します
  • Android:hardwareAcceleratedをtrueに設定しても、エラーは発生しません(ただし、他の理由でオンにできません)

1月18日編集

  • この問題は、Android:hardwareAcceleratedがfalseに設定されている場合にのみ発生することを忘れました

私もバグの理由を見つけました

理由はわかりませんが、コードのこの部分を変更しただけです

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();

    getWindow().setFormat(PixelFormat.RGB_565);
}

これとともに

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
}

そして、すべてがうまくいきました。サムスンのドライバーのバグ?多分...

これが誰かに役立つことを願っています

4
Davide Berra

glsurf.setVisibility(View.GONE)onPause()を呼び出すことは私のアプリでは機能しますが、glsurf.setVisibility(View.VISIBLE)onWindowFocusChanged()を呼び出すと機能しません。

glsurf.setVisibility(View.VISIBLE)onResume()を呼び出すと機能します。

0
Sam Lu