2012-11-09 24 views
20

मैं एंड्रॉइड पर ओपनजीएल-ईएस के लिए नया हूं, इसलिए मुझे अपने नोबिश प्रश्न के लिए क्षमा करें। मैं एंड्रॉइड v2.2 - एसडीके # 8 के लिए इस कार्यक्रम का निर्माण कर रहा हूं। मेरा टैबलेट एंड्रॉइड v3.1Android पर OpenGLES - IllegalStateException: setRenderer को इस उदाहरण के लिए पहले से ही बुलाया गया है

तक समर्थन करता है मैं डेवलपर.android.com पर एक ट्यूटोरियल का पालन करके एंड्रॉइड के लिए ओपनजीएल-ईएस पर्यावरण स्थापित करने की कोशिश कर रहा हूं। कार्यक्रम ठीक संकलित, और यह डिवाइस पर एक साधारण नीली स्क्रीन प्रदर्शित करना था। हालांकि, जब मैंने इसे अपने एंड्रॉइड डिवाइस पर चलाने की कोशिश की, तो मुझे "IllegalStateException: setRenderer पहले से ही इस उदाहरण के लिए बुलाया गया है" त्रुटि मिली। तब, जब

enter image description here

:

public class TA_SpaceActivity extends Activity 
{ 
    private MyGLSurfaceView myGLView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     myGLView = new MyGLSurfaceView(this); //NOTE: this is where the app crashed 
     setContentView(myGLView); 
    } 
} 

class MyGLSurfaceView extends GLSurfaceView 
{ 
    public MyGLSurfaceView(Context context) 
    { 
     super(context); 
     setRenderer (new MyRenderer()); 
     setEGLContextClientVersion(2); 
     setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); 
    } 
} 

class MyRenderer implements GLSurfaceView.Renderer 
{ 
    public void onSurfaceCreated(GL10 unsued, EGLConfig config) 
    { 
     GLES20.glClearColor(0.0f, 0.0f, 1.0f, 1.0f); 
    } 

    public void onDrawFrame(GL10 unused) 
    { 
     GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); 
    } 

    public void onSurfaceChanged(GL10 unused, int width, int height) 
    { 
     GLES20.glViewport(0, 0, width, height); 
    } 
} 

सबसे पहले, मुझे यकीन है कि बनाया है कि OpenGLES के लिए उपयोग करता है-फीचर टैग AndroidManifest.xml फ़ाइल में शामिल किया गया था:

नीचे मेरी कोड है मैंने एक डीबग रन किया, ActivityThread.perfo ने "स्रोत नहीं मिला" त्रुटि संदेश दिखाया। तो, मैं इसे करने के लिए पथ जोड़ा (और मैं भी सुनिश्चित करें कि android.jar फ़ाइल निर्देशिका में मौजूद है बनाया)

enter image description here

फिर भी, एप्लिकेशन लाइन "myGLView = नए MyGLSurfaceView जैसा दुर्घटनाग्रस्त हो गया (यह) "। जब मैंने लॉगकैट की जांच की, तो उसने दिखाया कि कार्यक्रम ने setRenderer() फ़ंक्शन कॉल पर एक IllegalStateException फेंक दिया है।

1) क्यों फेंक था एक "स्रोत नहीं मिला" त्रुटि संदेश स्रोत के लिए लिंक था:

enter image description here

तो, मैं 2 पहेली है कि मैं इस समय समझ में नहीं आता है परियोजना में स्पष्ट रूप से परिभाषित?

2) यह क्यों कहा गया "इस उदाहरण के लिए setRenderer() को बुलाया गया है"? मैंने इसे केवल "MyGLSurfaceView" उपclass में एक बार बुलाया।

पहली पहेली के लिए, मैंने जो सुना, उससे ग्रहण हमेशा आपके द्वारा बनाई गई हर यादृच्छिक त्रुटि के लिए "स्रोत नहीं मिला" संदेश फेंक देगा। क्या यह सही है? (यदि नहीं, तो कृपया मुझे सही करें)।

यदि ऐसा है, तो मुझे लगता है कि इस मुद्दे के मूल कारण में मेरे सबक्लास में setRenderer() विधि के साथ कुछ करना है। पूरे दिन घूमने के बाद, मुझे इस मुद्दे को ठीक करने का कोई तरीका नहीं मिला। क्या कोई शरीर मुझे इस बात का कुछ संकेत दे सकता है कि मैं इसे ठीक करने का प्रयास कर सकता हूं "अवैध स्टेटएक्स अपवाद: सेट रेन्डरर() को इस उदाहरण के लिए बुलाया गया है" समस्या?

आपकी मदद के लिए अग्रिम धन्यवाद।

+0

के बारे में "स्रोत नहीं मिला":

यहाँ परिवर्तन यह है कि मैंने बनाया है। इस विषय को देखें: http: // stackoverflow।कॉम/प्रश्न/14 9 42851/स्रोत-अटैचमेंट-इन-इन-इन-द-फाइल-लेआउटइनफ्लेटर-सीएल –

+0

"स्रोत नहीं मिला" त्रुटि संदेश के बारे में। इस विषय को देखें: http://stackoverflow.com/questions/14942851/the-source-attachment-does-not-contain-the-source-for-the-file-layoutinflater-cl –

उत्तर

41

मैंने इसे समझ लिया। Google के दस्तावेज़ों में खुदाई करने के बाद, मुझे पता चला कि setEGLContextClientVersion() को चेकरेंडर थ्रेडस्टेट() कहा जाता है; यह फ़ंक्शन अवैध अपवाद फेंकता है "setRenderer() को इस उदाहरण के लिए बुलाया गया है" अगर setRenderer() को कॉल किया गया था। तो, पहले setRenderer() को कॉल करने के बजाय, मैंने पहले setEGLContextClientVersion() को कॉल किया, और प्रोग्राम संकलित और बिना किसी समस्या के भाग गया। मैं अब अपने डिवाइस पर दिखाई देने वाली सुंदर नीली स्क्रीन देखता हूं।

public MyGLSurfaceView(Context context) 
{ 
    super(context); 
    setEGLContextClientVersion(2); 
    setRenderer (new MyRenderer()); 
    setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); 
} 
+1

एंड्रॉइड ऐप को सॉर्ट करने के हिस्से के रूप में फ्रेमवर्क और ओपनजीएल ईएस 2 मैंने जीएलएसयूफेस व्यू का उपयोग करके ब्रेकआउट गेम लिखा था। यह फ्रेमवर्क दस्तावेज़/डेमो में कोड से पहले चला जाता है लेकिन विशेष रूप से पागल नहीं करता है, इसलिए इसे अभी भी डेमो कोड के रूप में काम करना चाहिए। आप इसे http://code.google.com/p/android-breakout/ पर पा सकते हैं। – fadden

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