2016-06-24 5 views
0

Ich arbeite gerade an der Konvertierung von Android San-Angeles-Beispiel in OpenGL ES 2.0, anstatt der aktuellen 1.0 (mit meiner eigenen Version von Demo). Ich erhalte gerade diesen Fehler, und ich kann einfach nicht herausfinden, wo ich falsch liege.Nachrüstungen OpenGL 1.0 bis 2.0 in Android NDK

06-24 11:02:48.246 2528-2528/com.example.SanAngeles E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.example.SanAngeles, PID: 2528 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.SanAngeles/com.example.SanAngeles.DemoActivity}: java.lang.IllegalStateException: setRenderer has already been called for this instance. 

Hier ist mein DemoActivity (was ich die Frage annehmen ist in): Paket com.example.SanAngeles;

import android.app.Activity; 
import android.content.Context; 
import android.opengl.GLSurfaceView; 
import android.os.Bundle; 
import android.view.MotionEvent; 

import javax.microedition.khronos.egl.EGLConfig; 
import javax.microedition.khronos.opengles.GL10; 


public class DemoActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mGLView = new DemoGLSurfaceView(this); 
     setContentView(mGLView); 
    } 

    private GLSurfaceView mGLView; 

    static { 
     System.loadLibrary("sanangeles"); 
    } 
} 

class DemoGLSurfaceView extends GLSurfaceView { 
    public DemoGLSurfaceView(Context context) { 
     super(context); 
     setEGLContextClientVersion(2); 
     mRenderer = new DemoRenderer(); 
     setRenderer(mRenderer); 
    } 

    public boolean onTouchEvent(final MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      nativeTogglePauseResume(); 
     } 
     return true; 
    } 


    DemoRenderer mRenderer; 

    private static native void nativeTogglePauseResume(); 
} 

class DemoRenderer implements GLSurfaceView.Renderer { 
    public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
     nativeInit(); 
    } 

    public void onSurfaceChanged(GL10 gl, int w, int h) { 
     //gl.glViewport(0, 0, w, h); 
     nativeResize(w, h); 
    } 

    public void onDrawFrame(GL10 gl) { 
     nativeRender(); 
    } 

    private static native void nativeInit(); 
    private static native void nativeResize(int w, int h); 
    private static native void nativeRender(); 
    private static native void nativeDone(); 
} 
+0

Ist dies der Code für die gesamte Aktivität? Haben Sie einen Code in Ihren onStart() - oder onResume() -Methoden? – brohan322

Antwort

1

Sie können für GlSurfaceView here können Dokumentation (es wird auch in der sdk auf Ihrem Rechner installiert sein, irgendwo) auf den Quellcode peek here finden.

Das entsprechende Bit von Informationen ist, dass Sie nach SetRenderer einmal anrufen, Sie sind nicht die folgende später anrufen erlaubt:

  • SetRenderer (ein zweites Mal)
  • setEGLContextFactory
  • setEGLWindowSurfaceFactory
  • setEGLConfigChooser
  • setEGLContextClientVersion

Der Code, den Sie gepostet haben, zeigt nicht das, was Sie getan haben, aber ich denke, dass Sie wahrscheinlich eine dieser Funktionen in Code aufrufen, den Sie nicht gepostet haben. Die setEGL * -Funktionen müssen vor dem SetRenderer aufgerufen werden, damit sie funktionieren.