Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android上的OpenGLES-IllegalStateException:已为此实例调用setRenderer_Android_Eclipse_Opengl Es - Fatal编程技术网

Android上的OpenGLES-IllegalStateException:已为此实例调用setRenderer

Android上的OpenGLES-IllegalStateException:已为此实例调用setRenderer,android,eclipse,opengl-es,Android,Eclipse,Opengl Es,我是Android上OpenGL ES的新手,所以请原谅我的无趣问题。我正在为Android v2.2-SDK#8构建这个程序。我的平板电脑最多支持Android v3.1 我正试图通过遵循developer.Android.com上的教程为Android设置OpenGL ES环境。这个程序编译得很好,应该在设备上显示一个简单的蓝屏。然而,当我尝试在Android设备上运行它时,我得到了“IllegalStateException:setRenderer已经为此实例调用”错误 下面是我的代码:

我是Android上OpenGL ES的新手,所以请原谅我的无趣问题。我正在为Android v2.2-SDK#8构建这个程序。我的平板电脑最多支持Android v3.1

我正试图通过遵循developer.Android.com上的教程为Android设置OpenGL ES环境。这个程序编译得很好,应该在设备上显示一个简单的蓝屏。然而,当我尝试在Android设备上运行它时,我得到了“IllegalStateException:setRenderer已经为此实例调用”错误

下面是我的代码:

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的uses功能标签包含在AndroidManifest.xml文件中:

然后,当我执行调试运行时,ActivityThread.perfo显示一条“Source Not Found”错误消息。因此,我添加了路径(并且我还确保android.jar文件存在于目录中)

尽管如此,该应用程序还是在“myGLView=newmyglsurfaceview(this)”一行崩溃了。当我检查LogCat时,它显示程序在setRenderer()函数调用时抛出了一个IllegalStateException

所以,我现在有两个谜题我不明白:

1) 当项目中明确定义了指向源的链接时,为什么会抛出“未找到源”错误消息

2) 为什么它会说“这个实例调用了setRenderer()”?我在我的“MyGLSurfaceView”子类中只调用过一次

对于第一个谜题,据我所知,Eclipse几乎总是会抛出一条“SourceNotFound”消息,当您遇到每一个随机错误时。是这样吗?(如果没有,请纠正我)

如果是这种情况,那么我认为问题的根本原因与我的子类中的setRenderer()方法有关。经过一整天的胡闹,我找不到解决这个问题的方法。任何人都可以给我一些指针,说明我可以尝试解决这个“IllegalStateException:setRenderer()已为此实例调用”问题吗


提前谢谢你的帮助。

我想出来了。在深入研究Google的文档之后,我发现setEGLContextClientVersion()调用了checkRenderReadState();如果调用了setRenderer(),此函数将抛出非法异常“已为此实例调用setRenderer()”。因此,我没有先调用setRenderer(),而是先调用setEGLContextClientVersion(),程序编译并运行时没有出现问题。我现在看到漂亮的蓝色屏幕出现在我的设备上

以下是我所做的更改:

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

作为整理Android应用程序框架和OpenGL ES 2的一部分,我使用GLSurfaceView编写了一个突破游戏。它很好地超越了框架文档/演示中的代码,但没有做任何特别疯狂的事情,因此它仍然可以作为演示代码使用。你可以在.About“找不到来源”找到它。查看此主题:关于“未找到源”错误消息。看看这个话题: