diff -r 45b9f25ff611 -r 2fb781bbdd51 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 Mon Aug 06 22:33:07 2012 +0200 +++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/SDLActivity.java Mon Aug 06 22:39:36 2012 +0200 @@ -6,9 +6,12 @@ import javax.microedition.khronos.egl.EGLDisplay; import javax.microedition.khronos.egl.EGLSurface; -import org.hedgewars.hedgeroid.EngineProtocol.EngineProtocolNetwork; import org.hedgewars.hedgeroid.EngineProtocol.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.netplay.TickHandler; import android.app.Activity; import android.content.Context; @@ -23,6 +26,7 @@ import android.media.AudioTrack; import android.os.Bundle; import android.os.Handler; +import android.os.HandlerThread; import android.os.Message; import android.util.DisplayMetrics; import android.util.Log; @@ -37,13 +41,19 @@ SDL Activity */ public class SDLActivity extends Activity { - + /** + * Set startConfig to the desired config when starting this activity. This avoids having to parcel all + * the config objects into the Intent. Not particularly elegant, but it's actually a recommended + * way to do this (http://developer.android.com/guide/faq/framework.html#3) + */ + public static volatile GameConfig startConfig; + // Main components public static SDLActivity mSingleton; private static SDLSurface mSurface; // This is what SDL runs in. It invokes SDL_main(), eventually - private static Thread mSDLThread; + private static Thread mSDLThread; // Guarded by SDLActivity.class // Audio private static Thread mAudioThread; @@ -74,11 +84,8 @@ mSingleton = this; // Set up the surface - GameConfig config = getIntent().getParcelableExtra("config"); - - mSurface = new SDLSurface(getApplication(), config); + mSurface = new SDLSurface(getApplication(), startConfig); setContentView(mSurface); - SurfaceHolder holder = mSurface.getHolder(); } // Events @@ -108,15 +115,15 @@ 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); + synchronized(SDLActivity.class) { + if (mSDLThread != null) { + try { + mSDLThread.join(); + } catch(Exception e) { + Log.w("SDL", "Problem stopping thread: " + e); + } + mSDLThread = null; } - mSDLThread = null; - - //Log.v("SDL", "Finished waiting for SDL thread"); } } @@ -175,13 +182,14 @@ } public static void startApp(int width, int height, GameConfig config) { - // Start up the C app thread - if (mSDLThread == null) { - mSDLThread = new Thread(new SDLMain(width, height, config), "SDLThread"); - mSDLThread.start(); - } - else { - SDLActivity.nativeResume(); + synchronized(SDLActivity.class) { + // Start up the C app thread + if (mSDLThread == null) { + mSDLThread = new Thread(new SDLMain(width, height, config), "SDLThread"); + mSDLThread.start(); + } else { + SDLActivity.nativeResume(); + } } } @@ -425,23 +433,34 @@ public void run() { //Set up the IPC socket server to communicate with the engine - EngineProtocolNetwork ipc = new EngineProtocolNetwork(config); + 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(); + } + 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 '/' - // Runs SDL_main() with added parameters - SDLActivity.nativeInit(new String[] { String.valueOf(ipc.port), + 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); + } + }); try { - ipc.quitIPC(); - ipc.join(); + thread.quit(); + thread.join(); } catch (InterruptedException e) { - e.printStackTrace(); + throw new AssertionError(); } + Flib.INSTANCE.flib_gameconn_destroy(conn); Log.v("SDL", "SDL thread terminated"); } }