Changed package name from org.hedgewars to org.hedgewars.mobile hedgeroid
authorXeli
Fri, 01 Jul 2011 21:30:33 +0200
branchhedgeroid
changeset 5389 b3cc5b4099f1
parent 5387 e67241f4e59a
child 5391 eb9b25dea4af
Changed package name from org.hedgewars to org.hedgewars.mobile
project_files/Android-build/SDL-android-project/jni/SDL/src/core/android/SDL_android.cpp
project_files/Android-build/SDL-android-project/jni/SDL/src/main/android/SDL_android_main.cpp
project_files/Android-build/SDL-android-project/src/org/hedgewars/SDLActivity.java
project_files/Android-build/SDL-android-project/src/org/hedgewars/mobile/SDLActivity.java
--- a/project_files/Android-build/SDL-android-project/jni/SDL/src/core/android/SDL_android.cpp	Fri Jul 01 09:02:30 2011 +0200
+++ b/project_files/Android-build/SDL-android-project/jni/SDL/src/core/android/SDL_android.cpp	Fri Jul 01 21:30:33 2011 +0200
@@ -100,7 +100,7 @@
 }
 
 // Resize
-extern "C" void Java_org_hedgewars_SDLActivity_onNativeResize(
+extern "C" void Java_org_hedgewars_mobile_SDLActivity_onNativeResize(
                                     JNIEnv* env, jclass jcls,
                                     jint width, jint height, jint format)
 {
@@ -108,21 +108,21 @@
 }
 
 // Keydown
-extern "C" void Java_org_hedgewars_SDLActivity_onNativeKeyDown(
+extern "C" void Java_org_hedgewars_mobile_SDLActivity_onNativeKeyDown(
                                     JNIEnv* env, jclass jcls, jint keycode)
 {
     Android_OnKeyDown(keycode);
 }
 
 // Keyup
-extern "C" void Java_org_hedgewars_SDLActivity_onNativeKeyUp(
+extern "C" void Java_org_hedgewars_mobile_SDLActivity_onNativeKeyUp(
                                     JNIEnv* env, jclass jcls, jint keycode)
 {
     Android_OnKeyUp(keycode);
 }
 
 // Touch
-extern "C" void Java_org_hedgewars_SDLActivity_onNativeTouch(
+extern "C" void Java_org_hedgewars_mobile_SDLActivity_onNativeTouch(
                                     JNIEnv* env, jclass jcls,
                                     jint action, jfloat x, jfloat y, jfloat p)
 {
@@ -130,7 +130,7 @@
 }
 
 // Accelerometer
-extern "C" void Java_org_hedgewars_SDLActivity_onNativeAccel(
+extern "C" void Java_org_hedgewars_mobile_SDLActivity_onNativeAccel(
                                     JNIEnv* env, jclass jcls,
                                     jfloat x, jfloat y, jfloat z)
 {
@@ -140,14 +140,14 @@
 }
 
 // Quit
-extern "C" void Java_org_hedgewars_SDLActivity_nativeQuit(
+extern "C" void Java_org_hedgewars_mobile_SDLActivity_nativeQuit(
                                     JNIEnv* env, jclass cls)
 {    
     // Inject a SDL_QUIT event
     SDL_SendQuit();
 }
 
-extern "C" void Java_org_hedgewars_SDLActivity_nativeRunAudioThread(
+extern "C" void Java_org_hedgewars_mobile_SDLActivity_nativeRunAudioThread(
                                     JNIEnv* env, jclass cls)
 {
     /* This is the audio thread, with a different environment */
--- a/project_files/Android-build/SDL-android-project/jni/SDL/src/main/android/SDL_android_main.cpp	Fri Jul 01 09:02:30 2011 +0200
+++ b/project_files/Android-build/SDL-android-project/jni/SDL/src/main/android/SDL_android_main.cpp	Fri Jul 01 21:30:33 2011 +0200
@@ -17,7 +17,7 @@
 }
 
 // Start up the SDL app
-extern "C" void Java_org_hedgewars_SDLActivity_nativeInit(JNIEnv* env, jclass cls, jobjectArray strArray)
+extern "C" void Java_org_hedgewars_mobile_SDLActivity_nativeInit(JNIEnv* env, jclass cls, jobjectArray strArray)
 {
     /* This interface could expand with ABI negotiation, calbacks, etc. */
     SDL_Android_Init(env, cls);
--- a/project_files/Android-build/SDL-android-project/src/org/hedgewars/SDLActivity.java	Fri Jul 01 09:02:30 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,513 +0,0 @@
-package org.hedgewars;
-
-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.egl.EGLSurface;
-
-import android.app.Activity;
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.PixelFormat;
-import android.hardware.Sensor;
-import android.hardware.SensorEvent;
-import android.hardware.SensorEventListener;
-import android.hardware.SensorManager;
-import android.media.AudioFormat;
-import android.media.AudioManager;
-import android.media.AudioTrack;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.MotionEvent;
-import android.view.SurfaceHolder;
-import android.view.SurfaceView;
-import android.view.View;
-
-
-/**
-    SDL Activity
- */
-public class SDLActivity extends Activity {
-
-	// Main components
-	private static SDLActivity mSingleton;
-	public static SDLSurface mSurface;
-
-	// Audio
-	private static Thread mAudioThread;
-	private static AudioTrack mAudioTrack;
-
-	// Load the .so
-	static {
-
-		System.loadLibrary("SDL");
-		System.loadLibrary("SDL_image");
-		System.loadLibrary("mikmod");
-		System.loadLibrary("SDL_net");
-		System.loadLibrary("SDL_mixer");
-		System.loadLibrary("SDL_ttf");
-		System.loadLibrary("hwengine");
-		System.loadLibrary("main");
-	}
-
-	// Setup
-	protected void onCreate(Bundle savedInstanceState) {
-		//Log.v("SDL", "onCreate()");
-		super.onCreate(savedInstanceState);
-
-		// So we can call stuff from static callbacks
-		mSingleton = this;
-
-		// Set up the surface
-		mSurface = new SDLSurface(getApplication());
-		setContentView(mSurface);
-		SurfaceHolder holder = mSurface.getHolder();
-		holder.setType(SurfaceHolder.SURFACE_TYPE_GPU);
-	}
-
-	// Events
-	protected void onPause() {
-		//Log.v("SDL", "onPause()");
-		super.onPause();
-	}
-
-	protected void onResume() {
-		//Log.v("SDL", "onResume()");
-		super.onResume();
-	}
-
-	// Messages from the SDLMain thread
-	static int COMMAND_CHANGE_TITLE = 1;
-
-	// Handler for the messages
-	Handler commandHandler = new Handler() {
-		public void handleMessage(Message msg) {
-			if (msg.arg1 == COMMAND_CHANGE_TITLE) {
-				setTitle((String)msg.obj);
-			}
-		}
-	};
-
-	// Send a message from the SDLMain thread
-	void sendCommand(int command, Object data) {
-		Message msg = commandHandler.obtainMessage();
-		msg.arg1 = command;
-		msg.obj = data;
-		commandHandler.sendMessage(msg);
-	}
-
-	// C functions we call
-	public static native void nativeInit(String[] argv);
-	public static native void nativeQuit();
-	public static native void onNativeResize(int x, int y, int format);
-	public static native void onNativeKeyDown(int keycode);
-	public static native void onNativeKeyUp(int keycode);
-	public static native void onNativeTouch(int action, float x, 
-			float y, float p);
-	public static native void onNativeAccel(float x, float y, float z);
-	public static native void nativeRunAudioThread();
-
-
-	// Java functions called from C
-
-	public static boolean createGLContext(int majorVersion, int minorVersion) {
-		return mSurface.initEGL(majorVersion, minorVersion);
-	}
-
-	public static void flipBuffers() {
-		mSurface.flipEGL();
-	}
-
-	public static void setActivityTitle(String title) {
-		// Called from SDLMain() thread and can't directly affect the view
-		mSingleton.sendCommand(COMMAND_CHANGE_TITLE, title);
-	}
-
-	// Audio
-	private static Object buf;
-
-	public static Object audioInit(int sampleRate, boolean is16Bit, boolean isStereo, int desiredFrames) {
-		int channelConfig = isStereo ? AudioFormat.CHANNEL_CONFIGURATION_STEREO : AudioFormat.CHANNEL_CONFIGURATION_MONO;
-		int audioFormat = is16Bit ? AudioFormat.ENCODING_PCM_16BIT : AudioFormat.ENCODING_PCM_8BIT;
-		int frameSize = (isStereo ? 2 : 1) * (is16Bit ? 2 : 1);
-
-		Log.v("SDL", "SDL audio: wanted " + (isStereo ? "stereo" : "mono") + " " + (is16Bit ? "16-bit" : "8-bit") + " " + ((float)sampleRate / 1000f) + "kHz, " + desiredFrames + " frames buffer");
-
-		// Let the user pick a larger buffer if they really want -- but ye
-		// gods they probably shouldn't, the minimums are horrifyingly high
-		// latency already
-		desiredFrames = Math.max(desiredFrames, (AudioTrack.getMinBufferSize(sampleRate, channelConfig, audioFormat) + frameSize - 1) / frameSize);
-
-		mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,
-				channelConfig, audioFormat, desiredFrames * frameSize, AudioTrack.MODE_STREAM);
-
-		audioStartThread();
-
-		Log.v("SDL", "SDL audio: got " + ((mAudioTrack.getChannelCount() >= 2) ? "stereo" : "mono") + " " + ((mAudioTrack.getAudioFormat() == AudioFormat.ENCODING_PCM_16BIT) ? "16-bit" : "8-bit") + " " + ((float)mAudioTrack.getSampleRate() / 1000f) + "kHz, " + desiredFrames + " frames buffer");
-
-		if (is16Bit) {
-			buf = new short[desiredFrames * (isStereo ? 2 : 1)];
-		} else {
-			buf = new byte[desiredFrames * (isStereo ? 2 : 1)]; 
-		}
-		return buf;
-	}
-
-	public static void audioStartThread() {
-		mAudioThread = new Thread(new Runnable() {
-			public void run() {
-				mAudioTrack.play();
-				nativeRunAudioThread();
-			}
-		});
-
-		// I'd take REALTIME if I could get it!
-		mAudioThread.setPriority(Thread.MAX_PRIORITY);
-		mAudioThread.start();
-	}
-
-	public static void audioWriteShortBuffer(short[] buffer) {
-		for (int i = 0; i < buffer.length; ) {
-			int result = mAudioTrack.write(buffer, i, buffer.length - i);
-			if (result > 0) {
-				i += result;
-			} else if (result == 0) {
-				try {
-					Thread.sleep(1);
-				} catch(InterruptedException e) {
-					// Nom nom
-				}
-			} else {
-				Log.w("SDL", "SDL audio: error return from write(short)");
-				return;
-			}
-		}
-	}
-
-	public static void audioWriteByteBuffer(byte[] buffer) {
-		for (int i = 0; i < buffer.length; ) {
-			int result = mAudioTrack.write(buffer, i, buffer.length - i);
-			if (result > 0) {
-				i += result;
-			} else if (result == 0) {
-				try {
-					Thread.sleep(1);
-				} catch(InterruptedException e) {
-					// Nom nom
-				}
-			} else {
-				Log.w("SDL", "SDL audio: error return from write(short)");
-				return;
-			}
-		}
-	}
-
-	public static void audioQuit() {
-		if (mAudioThread != null) {
-			try {
-				mAudioThread.join();
-			} catch(Exception e) {
-				Log.v("SDL", "Problem stopping audio thread: " + e);
-			}
-			mAudioThread = null;
-
-			//Log.v("SDL", "Finished waiting for audio thread");
-		}
-
-		if (mAudioTrack != null) {
-			mAudioTrack.stop();
-			mAudioTrack = null;
-		}
-	}
-}
-
-/**
-    Simple nativeInit() runnable
- */
-class SDLMain implements Runnable {
-	private int surfaceWidth, surfaceHeight;
-	public SDLMain(int width, int height){
-		surfaceWidth = width;
-		surfaceHeight = height;
-	}
-	public void run() {
-		// Runs SDL_main()
-		
-		SDLActivity.nativeInit(new String[]{ "0", String.valueOf(surfaceWidth), String.valueOf(surfaceHeight), "0", "null", "xeli", "1", "1", "1", "0", "/sdcard/Android/data/org.xeli.dataapk/files/Data", "/sdcard/Data"});
-
-		//Log.v("SDL", "SDL thread terminated");
-	}
-}
-
-
-/**
-    SDLSurface. This is what we draw on, so we need to know when it's created
-    in order to do anything useful. 
-
-    Because of this, that's where we set up the SDL thread
- */
-class SDLSurface extends SurfaceView implements SurfaceHolder.Callback, 
-View.OnKeyListener, View.OnTouchListener, SensorEventListener  {
-
-	// This is what SDL runs in. It invokes SDL_main(), eventually
-	private Thread mSDLThread;    
-
-	// EGL private objects
-	private EGLContext  mEGLContext;
-	private EGLSurface  mEGLSurface;
-	private EGLDisplay  mEGLDisplay;
-
-	// Sensors
-	private static SensorManager mSensorManager;
-
-	// Startup    
-	public SDLSurface(Context context) {
-		super(context);
-		getHolder().addCallback(this); 
-
-		setFocusable(true);
-		setFocusableInTouchMode(true);
-		requestFocus();
-		setOnKeyListener(this); 
-		setOnTouchListener(this);   
-
-		mSensorManager = (SensorManager)context.getSystemService("sensor");  
-	}
-
-	// Called when we have a valid drawing surface
-	public void surfaceCreated(SurfaceHolder holder) {
-		//Log.v("SDL", "surfaceCreated()");
-
-		enableSensor(Sensor.TYPE_ACCELEROMETER, true);
-	}
-
-	// Called when we lose the surface
-	public void surfaceDestroyed(SurfaceHolder holder) {
-		//Log.v("SDL", "surfaceDestroyed()");
-
-		// Send a quit message to the application
-		SDLActivity.nativeQuit();
-
-		// Now wait for the SDL thread to quit
-		if (mSDLThread != null) {
-			try {
-				mSDLThread.join();
-			} catch(Exception e) {
-				Log.v("SDL", "Problem stopping thread: " + e);
-			}
-			mSDLThread = null;
-
-			//Log.v("SDL", "Finished waiting for SDL thread");
-		}
-
-		enableSensor(Sensor.TYPE_ACCELEROMETER, false);
-	}
-
-	// Called when the surface is resized
-	public void surfaceChanged(SurfaceHolder holder,
-			int format, int width, int height) {
-		Log.d("SDL", "surfaceChanged()"+ width + " + " + height);
-
-		int sdlFormat = 0x85151002; // SDL_PIXELFORMAT_RGB565 by default
-		switch (format) {
-		case PixelFormat.A_8:
-			Log.v("SDL", "pixel format A_8");
-			break;
-		case PixelFormat.LA_88:
-			Log.v("SDL", "pixel format LA_88");
-			break;
-		case PixelFormat.L_8:
-			Log.v("SDL", "pixel format L_8");
-			break;
-		case PixelFormat.RGBA_4444:
-			Log.v("SDL", "pixel format RGBA_4444");
-			sdlFormat = 0x85421002; // SDL_PIXELFORMAT_RGBA4444
-			break;
-		case PixelFormat.RGBA_5551:
-			Log.v("SDL", "pixel format RGBA_5551");
-			sdlFormat = 0x85441002; // SDL_PIXELFORMAT_RGBA5551
-			break;
-		case PixelFormat.RGBA_8888:
-			Log.v("SDL", "pixel format RGBA_8888");
-			sdlFormat = 0x86462004; // SDL_PIXELFORMAT_RGBA8888
-			break;
-		case PixelFormat.RGBX_8888:
-			Log.v("SDL", "pixel format RGBX_8888");
-			sdlFormat = 0x86262004; // SDL_PIXELFORMAT_RGBX8888
-			break;
-		case PixelFormat.RGB_332:
-			Log.v("SDL", "pixel format RGB_332");
-			sdlFormat = 0x84110801; // SDL_PIXELFORMAT_RGB332
-			break;
-		case PixelFormat.RGB_565:
-			Log.v("SDL", "pixel format RGB_565");
-			sdlFormat = 0x85151002; // SDL_PIXELFORMAT_RGB565
-			break;
-		case PixelFormat.RGB_888:
-			Log.v("SDL", "pixel format RGB_888");
-			// Not sure this is right, maybe SDL_PIXELFORMAT_RGB24 instead?
-			sdlFormat = 0x86161804; // SDL_PIXELFORMAT_RGB888
-			break;
-		default:
-			Log.v("SDL", "pixel format unknown " + format);
-			break;
-		}
-		SDLActivity.onNativeResize(width, height, sdlFormat);
-
-		// Now start up the C app thread
-		if (mSDLThread == null) {
-			mSDLThread = new Thread(new SDLMain(width, height), "SDLThread"); 
-			mSDLThread.start();       
-		}
-	}
-
-	// unused
-	public void onDraw(Canvas canvas) {}
-
-
-	// EGL functions
-	public boolean initEGL(int majorVersion, int minorVersion) {
-		Log.v("SDL", "Starting up OpenGL ES " + majorVersion + "." + minorVersion);
-
-		try {
-			EGL10 egl = (EGL10)EGLContext.getEGL();
-
-			EGLDisplay dpy = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
-
-			int[] version = new int[2];
-			egl.eglInitialize(dpy, version);
-
-			int EGL_OPENGL_ES_BIT = 1;
-			int EGL_OPENGL_ES2_BIT = 4;
-			int renderableType = 0;
-			if (majorVersion == 2) {
-				renderableType = EGL_OPENGL_ES2_BIT;
-			} else if (majorVersion == 1) {
-				renderableType = EGL_OPENGL_ES_BIT;
-			}
-			int[] configSpec = {
-					//EGL10.EGL_DEPTH_SIZE,   16,
-					EGL10.EGL_RENDERABLE_TYPE, renderableType,
-					EGL10.EGL_NONE
-			};
-			EGLConfig[] configs = new EGLConfig[1];
-			int[] num_config = new int[1];
-			if (!egl.eglChooseConfig(dpy, configSpec, configs, 1, num_config) || num_config[0] == 0) {
-				Log.e("SDL", "No EGL config available");
-				return false;
-			}
-			EGLConfig config = configs[0];
-
-			EGLContext ctx = egl.eglCreateContext(dpy, config, EGL10.EGL_NO_CONTEXT, null);
-			if (ctx == EGL10.EGL_NO_CONTEXT) {
-				Log.e("SDL", "Couldn't create context");
-				return false;
-			}
-
-			EGLSurface surface = egl.eglCreateWindowSurface(dpy, config, this, null);
-			if (surface == EGL10.EGL_NO_SURFACE) {
-				Log.e("SDL", "Couldn't create surface");
-				return false;
-			}
-
-			if (!egl.eglMakeCurrent(dpy, surface, surface, ctx)) {
-				Log.e("SDL", "Couldn't make context current");
-				return false;
-			}
-
-			mEGLContext = ctx;
-			mEGLDisplay = dpy;
-			mEGLSurface = surface;
-
-		} catch(Exception e) {
-			Log.v("SDL", e + "");
-			for (StackTraceElement s : e.getStackTrace()) {
-				Log.v("SDL", s.toString());
-			}
-		}
-
-		return true;
-	}
-
-	// EGL buffer flip
-	public void flipEGL() {
-		try {
-			EGL10 egl = (EGL10)EGLContext.getEGL();
-
-			egl.eglWaitNative(EGL10.EGL_NATIVE_RENDERABLE, null);
-
-			// drawing here
-
-			egl.eglWaitGL();
-
-			egl.eglSwapBuffers(mEGLDisplay, mEGLSurface);
-
-
-		} catch(Exception e) {
-			Log.v("SDL", "flipEGL(): " + e);
-			for (StackTraceElement s : e.getStackTrace()) {
-				Log.v("SDL", s.toString());
-			}
-		}
-	}
-
-	// Key events
-	public boolean onKey(View  v, int keyCode, KeyEvent event) {
-
-		if (event.getAction() == KeyEvent.ACTION_DOWN) {
-			//Log.v("SDL", "key down: " + keyCode);
-			SDLActivity.onNativeKeyDown(keyCode);
-			return true;
-		}
-		else if (event.getAction() == KeyEvent.ACTION_UP) {
-			//Log.v("SDL", "key up: " + keyCode);
-			SDLActivity.onNativeKeyUp(keyCode);
-			return true;
-		}
-
-		return false;
-	}
-
-	// Touch events
-	public boolean onTouch(View v, MotionEvent event) {
-
-		int action = event.getAction();
-		float x = event.getX();
-		float y = event.getY();
-		float p = event.getPressure();
-		// TODO: Anything else we need to pass?        
-		SDLActivity.onNativeTouch(action, x, y, p);
-		return true;
-	}
-
-	// Sensor events
-	public void enableSensor(int sensortype, boolean enabled) {
-		// TODO: This uses getDefaultSensor - what if we have >1 accels?
-		if (enabled) {
-			mSensorManager.registerListener(this, 
-					mSensorManager.getDefaultSensor(sensortype), 
-					SensorManager.SENSOR_DELAY_GAME, null);
-		} else {
-			mSensorManager.unregisterListener(this, 
-					mSensorManager.getDefaultSensor(sensortype));
-		}
-	}
-
-	public void onAccuracyChanged(Sensor sensor, int accuracy) {
-		// TODO
-	}
-
-	public void onSensorChanged(SensorEvent event) {
-		if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
-			SDLActivity.onNativeAccel(event.values[0],
-					event.values[1],
-					event.values[2]);
-		}
-	}
-
-}
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/mobile/SDLActivity.java	Fri Jul 01 21:30:33 2011 +0200
@@ -0,0 +1,513 @@
+package org.hedgewars.mobile;
+
+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.egl.EGLSurface;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.PixelFormat;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.media.AudioTrack;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+import android.view.View;
+
+
+/**
+    SDL Activity
+ */
+public class SDLActivity extends Activity {
+
+	// Main components
+	private static SDLActivity mSingleton;
+	public static SDLSurface mSurface;
+
+	// Audio
+	private static Thread mAudioThread;
+	private static AudioTrack mAudioTrack;
+
+	// Load the .so
+	static {
+
+		System.loadLibrary("SDL");
+		System.loadLibrary("SDL_image");
+		System.loadLibrary("mikmod");
+		System.loadLibrary("SDL_net");
+		System.loadLibrary("SDL_mixer");
+		System.loadLibrary("SDL_ttf");
+		System.loadLibrary("hwengine");
+		System.loadLibrary("main");
+	}
+
+	// Setup
+	protected void onCreate(Bundle savedInstanceState) {
+		//Log.v("SDL", "onCreate()");
+		super.onCreate(savedInstanceState);
+
+		// So we can call stuff from static callbacks
+		mSingleton = this;
+
+		// Set up the surface
+		mSurface = new SDLSurface(getApplication());
+		setContentView(mSurface);
+		SurfaceHolder holder = mSurface.getHolder();
+		holder.setType(SurfaceHolder.SURFACE_TYPE_GPU);
+	}
+
+	// Events
+	protected void onPause() {
+		//Log.v("SDL", "onPause()");
+		super.onPause();
+	}
+
+	protected void onResume() {
+		//Log.v("SDL", "onResume()");
+		super.onResume();
+	}
+
+	// Messages from the SDLMain thread
+	static int COMMAND_CHANGE_TITLE = 1;
+
+	// Handler for the messages
+	Handler commandHandler = new Handler() {
+		public void handleMessage(Message msg) {
+			if (msg.arg1 == COMMAND_CHANGE_TITLE) {
+				setTitle((String)msg.obj);
+			}
+		}
+	};
+
+	// Send a message from the SDLMain thread
+	void sendCommand(int command, Object data) {
+		Message msg = commandHandler.obtainMessage();
+		msg.arg1 = command;
+		msg.obj = data;
+		commandHandler.sendMessage(msg);
+	}
+
+	// C functions we call
+	public static native void nativeInit(String[] argv);
+	public static native void nativeQuit();
+	public static native void onNativeResize(int x, int y, int format);
+	public static native void onNativeKeyDown(int keycode);
+	public static native void onNativeKeyUp(int keycode);
+	public static native void onNativeTouch(int action, float x, 
+			float y, float p);
+	public static native void onNativeAccel(float x, float y, float z);
+	public static native void nativeRunAudioThread();
+
+
+	// Java functions called from C
+
+	public static boolean createGLContext(int majorVersion, int minorVersion) {
+		return mSurface.initEGL(majorVersion, minorVersion);
+	}
+
+	public static void flipBuffers() {
+		mSurface.flipEGL();
+	}
+
+	public static void setActivityTitle(String title) {
+		// Called from SDLMain() thread and can't directly affect the view
+		mSingleton.sendCommand(COMMAND_CHANGE_TITLE, title);
+	}
+
+	// Audio
+	private static Object buf;
+
+	public static Object audioInit(int sampleRate, boolean is16Bit, boolean isStereo, int desiredFrames) {
+		int channelConfig = isStereo ? AudioFormat.CHANNEL_CONFIGURATION_STEREO : AudioFormat.CHANNEL_CONFIGURATION_MONO;
+		int audioFormat = is16Bit ? AudioFormat.ENCODING_PCM_16BIT : AudioFormat.ENCODING_PCM_8BIT;
+		int frameSize = (isStereo ? 2 : 1) * (is16Bit ? 2 : 1);
+
+		Log.v("SDL", "SDL audio: wanted " + (isStereo ? "stereo" : "mono") + " " + (is16Bit ? "16-bit" : "8-bit") + " " + ((float)sampleRate / 1000f) + "kHz, " + desiredFrames + " frames buffer");
+
+		// Let the user pick a larger buffer if they really want -- but ye
+		// gods they probably shouldn't, the minimums are horrifyingly high
+		// latency already
+		desiredFrames = Math.max(desiredFrames, (AudioTrack.getMinBufferSize(sampleRate, channelConfig, audioFormat) + frameSize - 1) / frameSize);
+
+		mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,
+				channelConfig, audioFormat, desiredFrames * frameSize, AudioTrack.MODE_STREAM);
+
+		audioStartThread();
+
+		Log.v("SDL", "SDL audio: got " + ((mAudioTrack.getChannelCount() >= 2) ? "stereo" : "mono") + " " + ((mAudioTrack.getAudioFormat() == AudioFormat.ENCODING_PCM_16BIT) ? "16-bit" : "8-bit") + " " + ((float)mAudioTrack.getSampleRate() / 1000f) + "kHz, " + desiredFrames + " frames buffer");
+
+		if (is16Bit) {
+			buf = new short[desiredFrames * (isStereo ? 2 : 1)];
+		} else {
+			buf = new byte[desiredFrames * (isStereo ? 2 : 1)]; 
+		}
+		return buf;
+	}
+
+	public static void audioStartThread() {
+		mAudioThread = new Thread(new Runnable() {
+			public void run() {
+				mAudioTrack.play();
+				nativeRunAudioThread();
+			}
+		});
+
+		// I'd take REALTIME if I could get it!
+		mAudioThread.setPriority(Thread.MAX_PRIORITY);
+		mAudioThread.start();
+	}
+
+	public static void audioWriteShortBuffer(short[] buffer) {
+		for (int i = 0; i < buffer.length; ) {
+			int result = mAudioTrack.write(buffer, i, buffer.length - i);
+			if (result > 0) {
+				i += result;
+			} else if (result == 0) {
+				try {
+					Thread.sleep(1);
+				} catch(InterruptedException e) {
+					// Nom nom
+				}
+			} else {
+				Log.w("SDL", "SDL audio: error return from write(short)");
+				return;
+			}
+		}
+	}
+
+	public static void audioWriteByteBuffer(byte[] buffer) {
+		for (int i = 0; i < buffer.length; ) {
+			int result = mAudioTrack.write(buffer, i, buffer.length - i);
+			if (result > 0) {
+				i += result;
+			} else if (result == 0) {
+				try {
+					Thread.sleep(1);
+				} catch(InterruptedException e) {
+					// Nom nom
+				}
+			} else {
+				Log.w("SDL", "SDL audio: error return from write(short)");
+				return;
+			}
+		}
+	}
+
+	public static void audioQuit() {
+		if (mAudioThread != null) {
+			try {
+				mAudioThread.join();
+			} catch(Exception e) {
+				Log.v("SDL", "Problem stopping audio thread: " + e);
+			}
+			mAudioThread = null;
+
+			//Log.v("SDL", "Finished waiting for audio thread");
+		}
+
+		if (mAudioTrack != null) {
+			mAudioTrack.stop();
+			mAudioTrack = null;
+		}
+	}
+}
+
+/**
+    Simple nativeInit() runnable
+ */
+class SDLMain implements Runnable {
+	private int surfaceWidth, surfaceHeight;
+	public SDLMain(int width, int height){
+		surfaceWidth = width;
+		surfaceHeight = height;
+	}
+	public void run() {
+		// Runs SDL_main()
+		
+		SDLActivity.nativeInit(new String[]{ "0", String.valueOf(surfaceWidth), String.valueOf(surfaceHeight), "0", "null", "xeli", "1", "1", "1", "0", "/sdcard/Android/data/org.xeli.dataapk/files/Data", "/sdcard/Data"});
+
+		//Log.v("SDL", "SDL thread terminated");
+	}
+}
+
+
+/**
+    SDLSurface. This is what we draw on, so we need to know when it's created
+    in order to do anything useful. 
+
+    Because of this, that's where we set up the SDL thread
+ */
+class SDLSurface extends SurfaceView implements SurfaceHolder.Callback, 
+View.OnKeyListener, View.OnTouchListener, SensorEventListener  {
+
+	// This is what SDL runs in. It invokes SDL_main(), eventually
+	private Thread mSDLThread;    
+
+	// EGL private objects
+	private EGLContext  mEGLContext;
+	private EGLSurface  mEGLSurface;
+	private EGLDisplay  mEGLDisplay;
+
+	// Sensors
+	private static SensorManager mSensorManager;
+
+	// Startup    
+	public SDLSurface(Context context) {
+		super(context);
+		getHolder().addCallback(this); 
+
+		setFocusable(true);
+		setFocusableInTouchMode(true);
+		requestFocus();
+		setOnKeyListener(this); 
+		setOnTouchListener(this);   
+
+		mSensorManager = (SensorManager)context.getSystemService("sensor");  
+	}
+
+	// Called when we have a valid drawing surface
+	public void surfaceCreated(SurfaceHolder holder) {
+		//Log.v("SDL", "surfaceCreated()");
+
+		enableSensor(Sensor.TYPE_ACCELEROMETER, true);
+	}
+
+	// Called when we lose the surface
+	public void surfaceDestroyed(SurfaceHolder holder) {
+		//Log.v("SDL", "surfaceDestroyed()");
+
+		// Send a quit message to the application
+		SDLActivity.nativeQuit();
+
+		// Now wait for the SDL thread to quit
+		if (mSDLThread != null) {
+			try {
+				mSDLThread.join();
+			} catch(Exception e) {
+				Log.v("SDL", "Problem stopping thread: " + e);
+			}
+			mSDLThread = null;
+
+			//Log.v("SDL", "Finished waiting for SDL thread");
+		}
+
+		enableSensor(Sensor.TYPE_ACCELEROMETER, false);
+	}
+
+	// Called when the surface is resized
+	public void surfaceChanged(SurfaceHolder holder,
+			int format, int width, int height) {
+		Log.d("SDL", "surfaceChanged()"+ width + " + " + height);
+
+		int sdlFormat = 0x85151002; // SDL_PIXELFORMAT_RGB565 by default
+		switch (format) {
+		case PixelFormat.A_8:
+			Log.v("SDL", "pixel format A_8");
+			break;
+		case PixelFormat.LA_88:
+			Log.v("SDL", "pixel format LA_88");
+			break;
+		case PixelFormat.L_8:
+			Log.v("SDL", "pixel format L_8");
+			break;
+		case PixelFormat.RGBA_4444:
+			Log.v("SDL", "pixel format RGBA_4444");
+			sdlFormat = 0x85421002; // SDL_PIXELFORMAT_RGBA4444
+			break;
+		case PixelFormat.RGBA_5551:
+			Log.v("SDL", "pixel format RGBA_5551");
+			sdlFormat = 0x85441002; // SDL_PIXELFORMAT_RGBA5551
+			break;
+		case PixelFormat.RGBA_8888:
+			Log.v("SDL", "pixel format RGBA_8888");
+			sdlFormat = 0x86462004; // SDL_PIXELFORMAT_RGBA8888
+			break;
+		case PixelFormat.RGBX_8888:
+			Log.v("SDL", "pixel format RGBX_8888");
+			sdlFormat = 0x86262004; // SDL_PIXELFORMAT_RGBX8888
+			break;
+		case PixelFormat.RGB_332:
+			Log.v("SDL", "pixel format RGB_332");
+			sdlFormat = 0x84110801; // SDL_PIXELFORMAT_RGB332
+			break;
+		case PixelFormat.RGB_565:
+			Log.v("SDL", "pixel format RGB_565");
+			sdlFormat = 0x85151002; // SDL_PIXELFORMAT_RGB565
+			break;
+		case PixelFormat.RGB_888:
+			Log.v("SDL", "pixel format RGB_888");
+			// Not sure this is right, maybe SDL_PIXELFORMAT_RGB24 instead?
+			sdlFormat = 0x86161804; // SDL_PIXELFORMAT_RGB888
+			break;
+		default:
+			Log.v("SDL", "pixel format unknown " + format);
+			break;
+		}
+		SDLActivity.onNativeResize(width, height, sdlFormat);
+
+		// Now start up the C app thread
+		if (mSDLThread == null) {
+			mSDLThread = new Thread(new SDLMain(width, height), "SDLThread"); 
+			mSDLThread.start();       
+		}
+	}
+
+	// unused
+	public void onDraw(Canvas canvas) {}
+
+
+	// EGL functions
+	public boolean initEGL(int majorVersion, int minorVersion) {
+		Log.v("SDL", "Starting up OpenGL ES " + majorVersion + "." + minorVersion);
+
+		try {
+			EGL10 egl = (EGL10)EGLContext.getEGL();
+
+			EGLDisplay dpy = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
+
+			int[] version = new int[2];
+			egl.eglInitialize(dpy, version);
+
+			int EGL_OPENGL_ES_BIT = 1;
+			int EGL_OPENGL_ES2_BIT = 4;
+			int renderableType = 0;
+			if (majorVersion == 2) {
+				renderableType = EGL_OPENGL_ES2_BIT;
+			} else if (majorVersion == 1) {
+				renderableType = EGL_OPENGL_ES_BIT;
+			}
+			int[] configSpec = {
+					//EGL10.EGL_DEPTH_SIZE,   16,
+					EGL10.EGL_RENDERABLE_TYPE, renderableType,
+					EGL10.EGL_NONE
+			};
+			EGLConfig[] configs = new EGLConfig[1];
+			int[] num_config = new int[1];
+			if (!egl.eglChooseConfig(dpy, configSpec, configs, 1, num_config) || num_config[0] == 0) {
+				Log.e("SDL", "No EGL config available");
+				return false;
+			}
+			EGLConfig config = configs[0];
+
+			EGLContext ctx = egl.eglCreateContext(dpy, config, EGL10.EGL_NO_CONTEXT, null);
+			if (ctx == EGL10.EGL_NO_CONTEXT) {
+				Log.e("SDL", "Couldn't create context");
+				return false;
+			}
+
+			EGLSurface surface = egl.eglCreateWindowSurface(dpy, config, this, null);
+			if (surface == EGL10.EGL_NO_SURFACE) {
+				Log.e("SDL", "Couldn't create surface");
+				return false;
+			}
+
+			if (!egl.eglMakeCurrent(dpy, surface, surface, ctx)) {
+				Log.e("SDL", "Couldn't make context current");
+				return false;
+			}
+
+			mEGLContext = ctx;
+			mEGLDisplay = dpy;
+			mEGLSurface = surface;
+
+		} catch(Exception e) {
+			Log.v("SDL", e + "");
+			for (StackTraceElement s : e.getStackTrace()) {
+				Log.v("SDL", s.toString());
+			}
+		}
+
+		return true;
+	}
+
+	// EGL buffer flip
+	public void flipEGL() {
+		try {
+			EGL10 egl = (EGL10)EGLContext.getEGL();
+
+			egl.eglWaitNative(EGL10.EGL_NATIVE_RENDERABLE, null);
+
+			// drawing here
+
+			egl.eglWaitGL();
+
+			egl.eglSwapBuffers(mEGLDisplay, mEGLSurface);
+
+
+		} catch(Exception e) {
+			Log.v("SDL", "flipEGL(): " + e);
+			for (StackTraceElement s : e.getStackTrace()) {
+				Log.v("SDL", s.toString());
+			}
+		}
+	}
+
+	// Key events
+	public boolean onKey(View  v, int keyCode, KeyEvent event) {
+
+		if (event.getAction() == KeyEvent.ACTION_DOWN) {
+			//Log.v("SDL", "key down: " + keyCode);
+			SDLActivity.onNativeKeyDown(keyCode);
+			return true;
+		}
+		else if (event.getAction() == KeyEvent.ACTION_UP) {
+			//Log.v("SDL", "key up: " + keyCode);
+			SDLActivity.onNativeKeyUp(keyCode);
+			return true;
+		}
+
+		return false;
+	}
+
+	// Touch events
+	public boolean onTouch(View v, MotionEvent event) {
+
+		int action = event.getAction();
+		float x = event.getX();
+		float y = event.getY();
+		float p = event.getPressure();
+		// TODO: Anything else we need to pass?        
+		SDLActivity.onNativeTouch(action, x, y, p);
+		return true;
+	}
+
+	// Sensor events
+	public void enableSensor(int sensortype, boolean enabled) {
+		// TODO: This uses getDefaultSensor - what if we have >1 accels?
+		if (enabled) {
+			mSensorManager.registerListener(this, 
+					mSensorManager.getDefaultSensor(sensortype), 
+					SensorManager.SENSOR_DELAY_GAME, null);
+		} else {
+			mSensorManager.unregisterListener(this, 
+					mSensorManager.getDefaultSensor(sensortype));
+		}
+	}
+
+	public void onAccuracyChanged(Sensor sensor, int accuracy) {
+		// TODO
+	}
+
+	public void onSensorChanged(SensorEvent event) {
+		if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
+			SDLActivity.onNativeAccel(event.values[0],
+					event.values[1],
+					event.values[2]);
+		}
+	}
+
+}
+