私は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()がこのインスタンスに対して呼び出されました」という問題を修正するために何を試みることができるかについてのポインタを誰かが教えてくれますか?
よろしくお願いします。