diff -r d70a5b0d1190 -r 0481bd74267c project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/SDLActivity.java --- 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"); } }