23

私はAndroid上のOpenGL-ESを初めて使用するので、わいせつな質問をしてすみません。私はAndroidv2.2用にこのプログラムを構築しています-SDK#8。私のタブレットはAndroidv3.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-featureタグがAndroidManifest.xmlファイルに含まれていることを確認しました。

ここに画像の説明を入力してください

次に、デバッグを実行すると、ActivityThread.perfoに「ソースが見つかりません」というエラーメッセージが表示されました。そこで、パスを追加しました(また、android.jarファイルがディレクトリに存在することも確認しました)

ここに画像の説明を入力してください

それでも、アプリは「myGLView = new MyGLSurfaceView(this)」の行でクラッシュしました。LogCatを調べたところ、プログラムがsetRenderer()関数呼び出しでIllegalStateExceptionをスローしたことがわかりました。

ここに画像の説明を入力してください

ですから、現時点では理解できないパズルが2つあります。

1)プロジェクトでソースへのリンクが明確に定義されているのに、なぜ「ソースが見つかりません」というエラーメッセージがスローされるのですか?

2)「このインスタンスに対してsetRenderer()が呼び出された」と表示されたのはなぜですか?「MyGLSurfaceView」サブクラスで一度だけ呼び出しました。

最初のパズルでは、私が聞いたところによると、ランダムなエラーが発生するたびに、Eclipseはほとんどの場合「ソースが見つかりません」というメッセージをスローします。正しいですか?(そうでない場合は、私を訂正してください)。

この場合、問題の根本的な原因は、私のサブクラスのsetRenderer()メソッドに関係していると思います。一日中いじり回した後、私はこの問題を解決する方法を見つけることができませんでした。この「IllegalStateException:setRenderer()がこのインスタンスに対して呼び出されました」という問題を修正するために何を試みることができるかについてのポインタを誰かが教えてくれますか?

よろしくお願いします。

4

1 に答える 1

42

私はそれを考え出した。Googleのドキュメントを調べた後、setEGLContextClientVersion()がcheckRenderThreadState()を呼び出していることがわかりました。setRenderer()が呼び出された場合、この関数は不正な例外「このインスタンスに対してsetRenderer()が呼び出されました」をスローします。そのため、最初にsetRenderer()を呼び出す代わりに、最初にsetEGLContextClientVersion()を呼び出し、プログラムをコンパイルして問題なく実行しました。デバイスに美しいブルースクリーンが表示されています。

これが私が行った変更です:

public MyGLSurfaceView(Context context) 
{
    super(context);
    setEGLContextClientVersion(2);
    setRenderer (new MyRenderer());
    setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}
于 2012-11-09T17:45:37.577 に答える