안드로이드 개발 질문/답변
(글 수 45,052)
11-15 14:51:43.033: ERROR/AndroidRuntime(443): FATAL EXCEPTION: main
11-15 14:51:43.033: ERROR/AndroidRuntime(443): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.aoh.menu/com.aoh.menu.AOHActivity}: java.lang.NullPointerException
11-15 14:51:43.033: ERROR/AndroidRuntime(443): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
11-15 14:51:43.033: ERROR/AndroidRuntime(443): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
11-15 14:51:43.033: ERROR/AndroidRuntime(443): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
11-15 14:51:43.033: ERROR/AndroidRuntime(443): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
11-15 14:51:43.033: ERROR/AndroidRuntime(443): at android.os.Handler.dispatchMessage(Handler.java:99)
11-15 14:51:43.033: ERROR/AndroidRuntime(443): at android.os.Looper.loop(Looper.java:123)
11-15 14:51:43.033: ERROR/AndroidRuntime(443): at android.app.ActivityThread.main(ActivityThread.java:4627)
11-15 14:51:43.033: ERROR/AndroidRuntime(443): at java.lang.reflect.Method.invokeNative(Native Method)
11-15 14:51:43.033: ERROR/AndroidRuntime(443): at java.lang.reflect.Method.invoke(Method.java:521)
11-15 14:51:43.033: ERROR/AndroidRuntime(443): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
11-15 14:51:43.033: ERROR/AndroidRuntime(443): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
11-15 14:51:43.033: ERROR/AndroidRuntime(443): at dalvik.system.NativeStart.main(Native Method)
11-15 14:51:43.033: ERROR/AndroidRuntime(443): Caused by: java.lang.NullPointerException
11-15 14:51:43.033: ERROR/AndroidRuntime(443): at com.aoh.opengl.BufferGLUT.getFloatBufferFromFloatArray(BufferGLUT.java:10)
11-15 14:51:43.033: ERROR/AndroidRuntime(443): at com.aoh.opengl.Render.<init>(Render.java:20)
11-15 14:51:43.033: ERROR/AndroidRuntime(443): at com.aoh.opengl.RenderScene.<init>(RenderScene.java:13)
11-15 14:51:43.033: ERROR/AndroidRuntime(443): at com.aoh.opengl.ControlKey.<init>(ControlKey.java:13)
11-15 14:51:43.033: ERROR/AndroidRuntime(443): at com.aoh.menu.AOHActivity.onCreate(AOHActivity.java:13)
11-15 14:51:43.033: ERROR/AndroidRuntime(443): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
11-15 14:51:43.033: ERROR/AndroidRuntime(443): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
11-15 14:51:43.033: ERROR/AndroidRuntime(443): ... 11 more
package com.aoh.opengl;
import com.aoh.opengl.RenderScene;
import android.content.Context;
import android.opengl.GLSurfaceView;
import android.view.KeyEvent;
import android.view.MotionEvent;
public class ControlKey extends GLSurfaceView {
public ControlKey(Context context) {
super(context);
renderScene = new RenderScene(context);
setRenderer(renderScene);
setFocusable(true);
setFocusableInTouchMode(true); //터치
// TODO Auto-generated constructor stub
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
float x = 0;
float y = 0;
if(event.getAction() == MotionEvent.ACTION_DOWN) {
x = event.getX();
y = event.getY();
}
if (event.getAction() == MotionEvent.ACTION_MOVE) {
final float xdif = (x - event.getX());
final float ydif = (y - event.getY());
queueEvent(new Runnable() {
public void run() {
RenderScene.setXAngle(RenderScene.getXAngle() + ydif);
RenderScene.setYAngle(RenderScene.getYAngle() + xdif);
}
});
x = event.getX();
y = event.getY();
}
return true;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
switch(keyCode){
case KeyEvent.KEYCODE_DPAD_UP:
renderScene.up();
requestRender();
return true;
case KeyEvent.KEYCODE_DPAD_DOWN:
renderScene.down();
requestRender();
return true;
case KeyEvent.KEYCODE_DPAD_LEFT:
renderScene.left();
requestRender();
return true;
case KeyEvent.KEYCODE_DPAD_RIGHT:
renderScene.right();
requestRender();
return true;
case KeyEvent.KEYCODE_Z:
renderScene.zoom_in();
requestRender();
return true;
case KeyEvent.KEYCODE_X:
renderScene.zoom_out();
requestRender();
return true;
}
return super.onKeyDown(keyCode, event);
}
private RenderScene renderScene;
}
package com.aoh.menu;
import com.aoh.opengl.ControlKey;
import android.app.Activity;
import android.os.Bundle;
public class AOHActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
controlKey = new ControlKey(this);
setContentView(controlKey);
}
private ControlKey controlKey;
}
package com.aoh.opengl;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.content.Context;
import android.opengl.GLU;
import android.opengl.GLSurfaceView.Renderer;
import com.aoh.opengl.Render;
public class RenderScene implements Renderer{
private Context c;
private Render t = new Render(c);
private static float xangle = 0.0f;
private static float yangle = 0.0f;
private static float x_move = 0.0f;
private static float y_move = 0.0f;
private static float z_move = 10.0f;
public float[] pos= {10.0f, 10.0f, 10.0f, 1.0f};
public float[] amb = {1.0f, 1.0f, 1.0f, 1.0f};
public float[] dif = {0.5f, 0.5f, 0.5f, 1.0f};
public float[] spe = {0.8f, 0.8f, 0.8f, 1.0f};
public RenderScene(Context context) {
// TODO Auto-generated constructor stub
c = context;
}
@Override
public void onDrawFrame(GL10 gl) {
// TODO Auto-generated method stub
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
//gl.glPushMatrix();
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glShadeModel(GL10.GL_SMOOTH);
//gl.glColor4f(0, 0, 1, 1);
gl.glLoadIdentity();
GLU.gluLookAt(gl, 0.0f, 0.0f, z_move, x_move, y_move, 0.0f, 0.0f, 1.0f, 0.0f);
// gl.glTranslatef(0.0f, 0.0f, 0.0f);
gl.glRotatef(xangle , 1, 0, 0);
gl.glRotatef(yangle, 0, 1, 0);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
t.draw(gl);
//gl.glPopMatrix();
gl.glFlush();
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// TODO Auto-generated method stub
float aspect = (float)width/height;
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluPerspective(gl, 45.0f, aspect, 1, 1000000);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// TODO Auto-generated method stub
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
gl.glClearColor(0, 0, 0, 1);
gl.glEnable(GL10.GL_LIGHTING);
gl.glEnable(GL10.GL_LIGHT0);
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, pos, 0);
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, amb, 0);
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, dif, 0);
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_SPECULAR, spe, 0);
gl.glEnable(GL10.GL_LIGHT0);
gl.glMatrixMode(GL10.GL_MODELVIEW);
//gl.glEnable(GL10.GL_TEXTURE_2D);
//int[] textures = new int[1];
//gl.glGenTextures(1, textures, 0);
//gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
//gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
//gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
//Bitmap bitmap = BitmapFactory.decodeResource(c.getResources(), R.drawable.test);
//Bitmap bitmap256 = Bitmap.createScaledBitmap(bitmap, 256, 256, false);
//GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap256, 0);
//bitmap.recycle();
//bitmap256.recycle();
}
public void up(){
y_move--;
}
public void down(){
y_move++;
}
public void right(){
x_move--;
}
public void left(){
x_move++;
}
public void zoom_in(){
z_move--;
}
public void zoom_out(){
z_move++;
}
public static float getYAngle() {
// TODO Auto-generated method stub
return yangle;
}
public static float getXAngle() {
// TODO Auto-generated method stub
return xangle;
}
public static void setXAngle(float f) {
// TODO Auto-generated method stub
//f=0.0f;
xangle = f/4.0f;
}
public static void setYAngle(float f) {
// TODO Auto-generated method stub
//f=0.0f;
yangle = f/4.0f;
}
}
package com.aoh.opengl;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.FloatBuffer;
import java.util.StringTokenizer;
import javax.microedition.khronos.opengles.GL10;
import android.content.Context;
import android.content.res.AssetManager;
import android.util.Log;
import com.aoh.opengl.Object;
public class Render extends BufferGLUT{
public Render(Context context){
try {
AssetManager am = c.getAssets();
InputStream is =c.getAssets().open("test.ASE");
load("test.ASE");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.e("aho","before");
mVertexBuffer = getFloatBufferFromFloatArray(vertices);
Log.e("ahoo", "after");
// mIndexBuffer = getShortBufferFromShortArray(index);
// mTextureBuffer = getFloatBufferFromFloatArray(texCoords);
c = context;
}
/* float []texCoords ={
0,1, 1,1, 0,0,
1,1, 1,0, 0,0,
};*/
float []vertices;
public void load(String fileName){
try{
//List<String> lines = null;
BufferedReader br = new BufferedReader(new InputStreamReader(this.c.getAssets().open(fileName)));
String line = null;
String waste = null;
int waste1 = 0;
StringTokenizer tk = new StringTokenizer(line);
while(line != "*MESH_NUMVERTEX"){
line = br.readLine();
}
object.NumVertex=Integer.valueOf(line);
line = br.readLine();
object.NumFace=Integer.valueOf(line);
object.vertex = new Vertex[object.NumVertex];
object.face = new Face[object.NumFace];
vertices = new float[object.NumVertex*3];
int vertCounter = 0;
br.readLine();
for(int loop = 0; loop < object.NumVertex; loop++){
br.readLine();
tk = new StringTokenizer(line);
waste = String.valueOf(tk.nextToken());
waste1 = Integer.valueOf(tk.nextToken());
object.vertex[loop].x = Float.valueOf(tk.nextToken());
object.vertex[loop].z = Float.valueOf(tk.nextToken());
object.vertex[loop].y = Float.valueOf(tk.nextToken());
vertices[vertCounter++] = object.vertex[loop].x;
vertices[vertCounter++] = object.vertex[loop].y;
vertices[vertCounter++] = object.vertex[loop].z;
Log.e("x", ""+object.vertex[loop].x);
}
br.readLine();
br.readLine();
for(int loop = 0; loop < object.NumFace; loop++){
br.readLine();
tk = new StringTokenizer(line);
waste = String.valueOf(tk.nextToken());
waste = String.valueOf(tk.nextToken());
waste = String.valueOf(tk.nextToken());
object.face[loop].First = Integer.valueOf(tk.nextToken());
waste = String.valueOf(tk.nextToken());
object.face[loop].Second = Integer.valueOf(tk.nextToken());
waste = String.valueOf(tk.nextToken());
object.face[loop].Third = Integer.valueOf(tk.nextToken());
}
//br.close();
}
catch(Exception e){
}
}
void draw(GL10 gl){
gl.glFrontFace(GL10.GL_CW);
// gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTextureBuffer);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVertexBuffer);
// gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
//gl.glDrawElements(GL10.GL_TRIANGLES, index.length, GL10.GL_UNSIGNED_SHORT, mIndexBuffer);
//gl.glEnable(GL10.GL_TEXTURE_2D);
//main Bottom
for(int i=0;i<object.NumFace;i++){
// gl.glNormal3f(0.0f, 0.0f, 1.0f);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
if(i%3==0)
gl.glDrawArrays(GL10.GL_TRIANGLES, i, 3);
}
// gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
}
private Object object;
private Context c;
private FloatBuffer mVertexBuffer;
// private FloatBuffer mTextureBuffer;
// private ShortBuffer mIndexBuffer;
}