2011-08-01 7 views
1

내가 가지고 있었기 때문에 GL11을 초기화하기 위해 노력하고있어 고생 인수로서있는 ExceptionInInitializerError

GL11 gl 

했다 방법을 참조. 그래서 초기화가 렌더러 덤비는 된 것이 있다는 생각과에 초기화하는 새로운 클래스를 만들어 내 렌더러 클래스를 초기화하기 위해 시도했지만 작동하지 않았다.

import javax.microedition.khronos.egl.EGL10; 
import javax.microedition.khronos.egl.EGLConfig; 
import javax.microedition.khronos.egl.EGLContext; 
import javax.microedition.khronos.egl.EGLDisplay; 
import javax.microedition.khronos.opengles.GL11; 

import android.opengl.GLU; 



public class Unproject { 

public static float setx; 
public static float sety; 
public static float posx, posy, posz; 

EGLConfig[] configs = new EGLConfig[1]; 
EGLConfig config = configs[0]; 
static EGLContext glContext; 
public static GL11 gl = (GL11)glContext.getGL(); 
EGLDisplay dpy = ((EGL10) gl).eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); 

public Unproject() { 
    glContext = ((EGL10) gl).eglCreateContext(dpy, config, EGL10.EGL_NO_CONTEXT, null); 
} 

    public static void vector3 (GL11 gl){ 

     int[] viewport = new int[4]; 
     float[] modelview = new float[16]; 
     float[] projection = new float[16]; 
     float winx, winy, winz; 
     float[] newcoords = new float[3]; 

     gl.glGetIntegerv(GL11.GL_VIEWPORT, viewport, 0); 
     gl.glGetFloatv(GL11.GL_MODELVIEW_MATRIX, modelview, 0); 
     gl.glGetFloatv(GL11.GL_PROJECTION_MATRIX, projection, 0); 

     winx = (float)setx; 
     winy = (float)viewport[3] - sety; 
     winz = 0; 

     GLU.gluUnProject(winx, winy, winz, modelview, 0, projection, 0, viewport, 0, newcoords, 0); 
     posx = (int)newcoords[1]; 
     posy = (int)newcoords[2]; 
     posz = (int)newcoords[3]; 


    } 
} 

Vector3 내가 가진 한 방법이다 문제. 렌더러에서이 클래스로 옮겼습니다. 여기

내 렌더러 :

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


import android.opengl.GLU; 
import android.opengl.GLSurfaceView.Renderer; 
import android.view.MotionEvent; 


public class GLSurfaceRenderer implements Renderer{ 


public float setx, sety; 
private float posx, posy, posz; 
private double speed; 
private static float rotation; 
private static float statrotation; 

GL11 gl; 



private static FlatColoredSquare square; 
private static FlatColoredSquare statSquare; 



    public GLSurfaceRenderer() { 

    square = new FlatColoredSquare(); 
    statSquare = new FlatColoredSquare(); 
    rotation = (float) Math.floor(Math.random()*361); 
    speed = 0.1;  

} 
    public synchronized void randomMethod(MotionEvent event){ 
     if (event.getAction() == MotionEvent.ACTION_DOWN){ 
     setx = event.getX(); 
     sety = event.getY(); 
     Unproject.vector3(gl); 
     } 
    } 

@Override 
public void onDrawFrame(GL10 gl) { 
     gl.glClear(GL10.GL_COLOR_BUFFER_BIT | 
      GL10.GL_DEPTH_BUFFER_BIT); 
    gl.glLoadIdentity(); 
    gl.glScalef(10, 10, 0); 
    gl.glPushMatrix(); 
    gl.glRotatef(rotation, 0, 0, 1); 
    gl.glTranslatef((float) speed/10, 0, 0);  
    square.draw(gl);  
    gl.glPopMatrix(); 

    gl.glPushMatrix(); 
    gl.glTranslatef(posx, posy, posz); 
    gl.glRotatef(statrotation,0,0,1); 
    statSquare.draw(gl); 
    gl.glPopMatrix(); 


    statrotation++; 
    speed++;  

} 





@Override 
public void onSurfaceChanged(GL10 gl, int width, int height) { 
    gl.glViewport(0, 0, width, height); 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    GLU.gluOrtho2D(gl, 0.0f, width, 0.0f, height); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity(); 

} 

@Override 
public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
    gl.glShadeModel(GL10.GL_SMOOTH); 
    gl.glClearDepthf(1.0f); 
    gl.glEnable(GL10.GL_DEPTH_TEST); 
    gl.glDepthFunc(GL10.GL_LEQUAL); 
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); 

} 



} 

가 Unfortuanatly이 코드가있는 ExceptionInInitializerError

08-01 17:01:34.672: ERROR/AndroidRuntime(421): Uncaught handler: thread main exiting due to uncaught exception 
08-01 17:01:34.762: ERROR/AndroidRuntime(421): java.lang.ExceptionInInitializerError 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at android.app.ui.GLSurfaceRenderer.randomMethod(GLSurfaceRenderer.java:44) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at android.app.ui.Practice.onTouchEvent(Practice.java:37) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at android.app.Activity.dispatchTouchEvent(Activity.java:2064) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1690) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at android.os.Handler.dispatchMessage(Handler.java:99) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at android.os.Looper.loop(Looper.java:123) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at android.app.ActivityThread.main(ActivityThread.java:4310) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at java.lang.reflect.Method.invoke(Method.java:521) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at dalvik.system.NativeStart.main(Native Method) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421): Caused by: java.lang.NullPointerException 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at android.app.ui.Unproject.<clinit>(Unproject.java:22) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  ... 13 more 

을 던졌습니다 나는이 문제를 해결하기 위해 할 수있는 일이 있나요? 나는 틀린 나무를 완전히 위로하고 있냐? 클래스간에 변수를 공유하는 방법이 될 수 있다고 생각합니다. 더 좋은 방법이 있나요?

답변

1

오류가 나타나는 것은 클래스 초기화에서 NullPointerException이 발생했기 때문입니다.

static EGLContext glContext; 
public static GL11 gl = (GL11)glContext.getGL(); 

당신은 당신이 초기화되지 EGLContext의 인스턴스에서 getGl()를 호출하려고 알 수 있습니다. 사용할 수 있으려면 먼저 glContext에 무언가를 지정해야합니다.

stacktrace에는 <clinit>이 나와 있습니다. 의미가 무엇인지 모르는 경우별로 도움이되지 않습니다. 이 클래스의 초기화, 정적 멤버를 초기화하는 경우 (이 경우에서와 같이) 일 것입니다 참조하고,뿐만 아니라 다음과 같습니다 정적 초기화 블록을 참조 할 수 있습니다 :

static { 
    //some static init code 
} 

ExceptionInInitializerError이 던져이라고 그 이유는이 왜냐하면 더 높은 무언가가 모든 예외를 잡아서 ExceptionInInitializerError에 배치하기 때문입니다.

+0

glContext를 할당 할 수있는 것에 대한 제안. 누군가 DEPTH_BUFFER을 제안했지만 받아 들일 수는 없을 것입니다. = ( – Jack

+0

설명서에 따르면, 공개되지 않은 생성자가 있습니다 : http://developer.android.com/reference/javax/microedition/khronos/egl/EGLContext.html #EGLContext() –

+0

내 코드에서 좀 더 아래쪽으로 내려 놓았는데, GL11 위로 이동해야합니까? glContext가 GL11을 사용하기 때문에 불행히도 문제가 생깁니다. erm =/ – Jack

2

Based on this documentation 정적 초기화 프로그램이나 정적 변수의 초기화 프로그램을 평가하는 동안 예외가 발생했음을 나타 내기 위해 ExceptionInInitializerError가 발생합니다. 코드에 정적 초기화 논리가 있는지 확인하십시오.