2015-05-22 6 views
28

मैं अपने ऐप पर इस त्रुटि रिपोर्टeglMakeCurrent में विफल रहा है EGL_BAD_ALLOC

Fatal Exception: java.lang.IllegalStateException 
eglMakeCurrent failed EGL_BAD_ALLOC 
android.view.HardwareRenderer$GlRenderer.createSurface 

प्ले स्टोर पर है कि हो रही है पर रहते हैं। इस दुर्घटना का कारण क्या है और इसे कैसे ठीक किया जा सकता है? नीचे पूर्ण त्रुटि लॉग है।

java.lang.IllegalStateException: eglMakeCurrent failed EGL_BAD_ALLOC 
    at android.view.HardwareRenderer$GlRenderer.createSurface(HardwareRenderer.java:1354) 
    at android.view.HardwareRenderer$GlRenderer.createEglSurface(HardwareRenderer.java:1241) 
    at android.view.HardwareRenderer$GlRenderer.initialize(HardwareRenderer.java:1058) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1811) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1235) 
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6472) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:803) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:603) 
    at android.view.Choreographer.doFrame(Choreographer.java:573) 
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:789) 
    at android.os.Handler.handleCallback(Handler.java:733) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:157) 
    at android.app.ActivityThread.main(ActivityThread.java:5356) 
    at java.lang.reflect.Method.invokeNative(Method.java) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
    at dalvik.system.NativeStart.main(NativeStart.java) 
+0

हे क्या आपको इसका समाधान मिल गया है? –

+0

@ ओशामहू नोप.मैंने कभी नहीं पाया है। –

+0

@AlexKombo क्या आप हमें बता सकते हैं कि कौन से डिवाइस इस त्रुटि में हैं? ऐसा लगता है कि त्रुटि डिवाइस विशिष्ट है और डिवाइस को जानना इसे कम करने में मदद करेगा। – Milk

उत्तर

1

यदि आप EGL specification पर देखते हैं, तो इस त्रुटि के लिए कई संभावित कारण हैं। ऐसा लगता है कि आपके एप्लिकेशन में कुछ ऐसा संसाधनों से बाहर निकलने का कारण बन रहा है। कल्पना राज्यों निम्नलिखित:

3.7.3 बाध्यकारी संदर्भ और ड्रॉएबल

... eglMakeCurrent वर्तमान प्रतिपादन धागा करने के लिए और ड्रा और पढ़ने सतहों ctx बांधता है ...

त्रुटियाँ

... ड्रा और पढ़ने के लिए सहायक बफ़र्स आवंटित नहीं किया जा सकता है, एक +०१२३५१६४१०६EGL_BAD_ALLOC त्रुटि उत्पन्न होता है ...

समस्या के निवारण के लिए, आप अपने आवेदन की स्मृति के उपयोग का निरीक्षण कर सकते हैं। वहाँ अपने आवेदन के राम उपयोग की जांच के लिए कई अलग अलग तकनीक some techniques are documented quite well in this guide.

This post भी बताता है कि जब eglMakeCurrent बुला अगर पिक्सेल बफर के EGL_WIDTH और EGL_HEIGHT मापदंडों जब eglCreatePbufferSurface बुला सेट नहीं हैं त्रुटि शुरू हो रहा है कर रहे हैं। यहाँ एक न्यूनतम जावा नमूना एक पिक्सेल बफर (full source located here) बनाने के लिए है, यह सुनिश्चित करें कि इनपुट चौड़ाई और ऊंचाई शून्य से अधिक कर रहे हैं:

private void eglSetup(int width, int height) { 
    mEGL = (EGL10)EGLContext.getEGL(); 
    mEGLDisplay = mEGL.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); 
    if (!mEGL.eglInitialize(mEGLDisplay, null)) { 
     throw new RuntimeException("unable to initialize EGL10"); 
    } 

    // Configure EGL for pbuffer and OpenGL ES 2.0. We want enough RGB bits 
    // to be able to tell if the frame is reasonable. 
    int[] attribList = { 
      EGL10.EGL_RED_SIZE, 8, 
      EGL10.EGL_GREEN_SIZE, 8, 
      EGL10.EGL_BLUE_SIZE, 8, 
      EGL10.EGL_SURFACE_TYPE, EGL10.EGL_PBUFFER_BIT, 
      EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 
      EGL10.EGL_NONE 
    }; 
    EGLConfig[] configs = new EGLConfig[1]; 
    int[] numConfigs = new int[1]; 
    if (!mEGL.eglChooseConfig(mEGLDisplay, attribList, configs, 1, numConfigs)) { 
     throw new RuntimeException("unable to find RGB888+pbuffer EGL config"); 
    } 

    // Configure context for OpenGL ES 2.0. 
    int[] attrib_list = { 
      EGL14.EGL_CONTEXT_CLIENT_VERSION, 2, 
      EGL10.EGL_NONE 
    }; 
    mEGLContext = mEGL.eglCreateContext(mEGLDisplay, configs[0], EGL10.EGL_NO_CONTEXT, 
     attrib_list); 
    checkEglError("eglCreateContext"); 
    if (mEGLContext == null) { 
     throw new RuntimeException("null context"); 
    } 

    // Create a pbuffer surface. By using this for output, we can use glReadPixels 
    // to test values in the output. 
    int[] surfaceAttribs = { 
      EGL10.EGL_WIDTH, width, 
      EGL10.EGL_HEIGHT, height, 
      EGL10.EGL_NONE 
    }; 
    mEGLSurface = mEGL.eglCreatePbufferSurface(mEGLDisplay, configs[0], surfaceAttribs); 
    checkEglError("eglCreatePbufferSurface"); 
    if (mEGLSurface == null) { 
     throw new RuntimeException("surface was null"); 
    } 

    mEGL.eglMakeCurrent(mEGLDisplay, mEGLSurface, mEGLSurface, mEGLContext); 
} 

यह आपके आवेदन की क्रियान्वयन पर अधिक विवरण जानने के बिना सही कारण का पता लगाने के लिए मुश्किल है । इस मुद्दे को पहचानने और ठीक करने के लिए यह एक अच्छा प्रारंभिक बिंदु होना चाहिए।

संबंधित मुद्दे