project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/SDLActivity.java
changeset 7485 0481bd74267c
parent 7476 2fb781bbdd51
child 7508 763d3961400b
--- a/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/SDLActivity.java	Sun Aug 12 22:37:57 2012 +0200
+++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/SDLActivity.java	Sun Aug 12 22:46:23 2012 +0200
@@ -6,13 +6,16 @@
 import javax.microedition.khronos.egl.EGLDisplay;
 import javax.microedition.khronos.egl.EGLSurface;
 
-import org.hedgewars.hedgeroid.EngineProtocol.GameConfig;
+import org.hedgewars.hedgeroid.Datastructures.GameConfig;
 import org.hedgewars.hedgeroid.EngineProtocol.PascalExports;
 import org.hedgewars.hedgeroid.frontlib.Flib;
 import org.hedgewars.hedgeroid.frontlib.Frontlib.GameSetupPtr;
 import org.hedgewars.hedgeroid.frontlib.Frontlib.GameconnPtr;
+import org.hedgewars.hedgeroid.frontlib.Frontlib.IntCallback;
 import org.hedgewars.hedgeroid.netplay.TickHandler;
 
+import com.sun.jna.Pointer;
+
 import android.app.Activity;
 import android.content.Context;
 import android.graphics.Canvas;
@@ -424,7 +427,18 @@
 
 	private final int surfaceWidth, surfaceHeight;
 	private final GameConfig config;
-
+	private GameconnPtr conn;
+	HandlerThread thread = new HandlerThread("IPC thread");
+	
+	private final IntCallback dccb = new IntCallback() {
+		public void callback(Pointer context, int arg1) {
+			Log.d("SDLMain", "Disconnected: "+arg1);
+			Flib.INSTANCE.flib_gameconn_destroy(conn);
+			conn = null;
+			thread.quit();
+		}
+	};
+	
 	public SDLMain(int width, int height, GameConfig _config) {
 		config = _config;
 		surfaceWidth = width;
@@ -433,35 +447,40 @@
 
 	public void run() {
 		//Set up the IPC socket server to communicate with the engine
-		HandlerThread thread = new HandlerThread("IPC thread");
-		thread.start(); // TODO ensure it gets stopped
+		
 		final GameconnPtr conn = Flib.INSTANCE.flib_gameconn_create("Xeli", GameSetupPtr.createJavaOwned(config), false);
 		if(conn == null) {
 			throw new AssertionError();
 		}
+		Flib.INSTANCE.flib_gameconn_onDisconnect(conn, dccb, null);
 		int port = Flib.INSTANCE.flib_gameconn_getport(conn);
 
 		String path = Utils.getDataPath(SDLActivity.mSingleton);//This represents the data directory
 		path = path.substring(0, path.length()-1);//remove the trailing '/'
 
+		thread.start(); // TODO ensure it gets stopped
+		new TickHandler(thread.getLooper(), 500, new Runnable() {
+			public void run() {
+				Log.d("SDLMain", "pre-tick");
+				Flib.INSTANCE.flib_gameconn_tick(conn);
+				Log.d("SDLMain", "post-tick");
+			}
+		}).start();
+		
+		Log.d("SDLMain", "Starting engine");
 		// Runs SDL_main() with added parameters
 		SDLActivity.nativeInit(new String[] { String.valueOf(port),
 				String.valueOf(surfaceWidth), String.valueOf(surfaceHeight),
 				"0", "en.txt", "xeli", "1", "1", "1", path, ""  });
-
-		new TickHandler(thread.getLooper(), 50, new Runnable() {
-			public void run() {
-				Flib.INSTANCE.flib_gameconn_tick(conn);
-			}
-		});
+		Log.d("SDLMain", "Engine stopped");
 		try {
-			thread.quit();
 			thread.join();
 		} catch (InterruptedException e) {
 			throw new AssertionError();
 		}
+		Log.v("SDLMain", "thread joined");
 		Flib.INSTANCE.flib_gameconn_destroy(conn);
-		Log.v("SDL", "SDL thread terminated");
+		Log.v("SDLMain", "SDL thread terminated");
 	}
 }