2017-03-13 1 views
2
アンドロイド

にopengles内のスレッドを解放することはできません。 他のデバイス(galaxy note2,3 galaxy S7)ではエラーが発生しません。 IはopenGLES 2.0のJNIを使​​用して、特定のデバイスがは <p>機能、eglReleaseThread()を呼び出し</p>は、すぐにアプリケーションを「ギャラクシーS4」で、特定のデバイス上の任意の戻り値なしで閉じられている..私はいくつかの問題を抱えている

これは解除部のソースコードである4.3バージョン(API 18)を有しています。

if (mEGLDisplay != EGL_NO_DISPLAY) { 
    CppLog("env - release - exist display"); 
    if(!eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)){ 
     CppError("ImageProcGLES - eglMakeCurrent"); 
     return -1; 
    } 
    else{ 
     CppLog("env - release - eglMakeCurrent"); 
    } 

    if(!eglDestroySurface(mEGLDisplay, mEGLSurface)){ 
     CppError("ImageProcGLES - eglDestroySurface Error."); 
     return -1; 
    } 
    else{ 
     CppLog("env - release - eglDestroySurface"); 
    } 

    if(!eglDestroyContext(mEGLDisplay, mEGLContext)){ 
     CppError("ImageProcGLES - eglDestroyContext."); 
     return -1; 
    }else{ 
     CppLog("env - release - eglDestroyContext"); 
    } 

    if(!eglReleaseThread()){ 
     CppError("ImageProcGLES - eglReleaseThread."); 
     return -1; 
    }else{ 
     CppLog("env - release - eglReleaseThread"); 
    } 

    if(!eglTerminate(mEGLDisplay)){ 
     CppError("ImageProcGLES - eglTerminate."); 
     return -1; 
    }else{ 
     CppLog("env - release - eglTerminate"); 
    } 
} 
else{ 
    CppError("env - release - No Display"); 
} 

これは返信ログです。あなたはいくつかのアイデアを持っている場合は

buffer - release 
    env - release - start 
    env - release - exist display 
    env - release - eglMakeCurrent 
    env - release - eglDestroySurface 
    env - release - eglDestroyContext 

...私を助けてください:(

+0

デバイスドライバのバグのようです。どのGalaxy S4の特定のモデルを使用していますか? SGX GPUに基づくものもあれば、Adreno GPUに基づくものもあります。 – solidpixel

+0

@solidpixelデバイスドライブにバグがある場合は、問題の解決方法を教えてください。 どのGPUが使用されているのか分かりませんが、おそらく** SGX544MP3に基づいた** I9500 /韓国モデル** GPU –

+0

修正できません。おそらくそれを回避するが、修正しないでください。最良の答えは 'eglReleaseThread()'の呼び出しを避けるだけです...理論的には、とにかく 'eglTerminate()'を呼び出すと、すべてのEGLリソースを解放する必要があります。 – solidpixel

答えて

1

それはEGLドライバのバグです。私は、表面からEGL表面を作成し、それを回避するために、同じ問題を持っていたし、ないSurfaceTexture あなたは表面を作成する場合:ここ

mSurface = new Surface(mSurfaceTexture); 
      mEglSurface = EGL14.eglCreateWindowSurface(mEglDisplay, 
mEglConfig, mSurface, surfaceAttribs, 0); 

キーモーメントがSurfaceTextureからサーフェスを作成することです:

Surface surface = new Surface(mSurfaceTexture); 
関連する問題