瀏覽代碼

fixed #104: loading of multiple .love files

fysx 10 年之前
父節點
當前提交
168357e1ad
共有 4 個文件被更改,包括 88 次插入55 次删除
  1. 1 0
      AndroidManifest.xml
  2. 17 14
      jni/love/src/common/android.cpp
  3. 49 35
      src/org/libsdl/app/SDLActivity.java
  4. 21 6
      src/org/love2d/android/GameActivity.java

+ 1 - 0
AndroidManifest.xml

@@ -19,6 +19,7 @@
         android:name="GameActivity"
         android:configChanges="orientation|screenSize"
         android:label="LÖVE for Android"
+        android:launchMode="singleTop"
         android:screenOrientation="landscape" >
         <intent-filter>
           <action android:name="android.intent.action.MAIN" />

+ 17 - 14
jni/love/src/common/android.cpp

@@ -75,23 +75,26 @@ const char* getSelectedGameFile()
 {
 	static const char *path = NULL;
 
-	if (!path) {
-		JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
-		jclass activity = env->FindClass("org/love2d/android/GameActivity");
-
-		jmethodID getGamePath = env->GetStaticMethodID(activity, "getGamePath", "()Ljava/lang/String;");
-		jstring gamePath = (jstring) env->CallStaticObjectMethod(activity, getGamePath);
-		const char *utf = env->GetStringUTFChars(gamePath, 0);
-		if (utf)
-		{
-			path = SDL_strdup(utf);
-			env->ReleaseStringUTFChars(gamePath, utf);
-		}
+	if (path) {
+		delete path;
+		path = NULL;
+	}
 
-		env->DeleteLocalRef (gamePath);
-		env->DeleteLocalRef (activity);
+	JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
+	jclass activity = env->FindClass("org/love2d/android/GameActivity");
+
+	jmethodID getGamePath = env->GetStaticMethodID(activity, "getGamePath", "()Ljava/lang/String;");
+	jstring gamePath = (jstring) env->CallStaticObjectMethod(activity, getGamePath);
+	const char *utf = env->GetStringUTFChars(gamePath, 0);
+	if (utf)
+	{
+		path = SDL_strdup(utf);
+		env->ReleaseStringUTFChars(gamePath, utf);
 	}
 
+	env->DeleteLocalRef (gamePath);
+	env->DeleteLocalRef (activity);
+
 	return path;
 }
 

+ 49 - 35
src/org/libsdl/app/SDLActivity.java

@@ -98,25 +98,8 @@ public class SDLActivity extends Activity {
     protected void onCreate(Bundle savedInstanceState) {
         Log.v("SDL", "onCreate():" + mSingleton);
         super.onCreate(savedInstanceState);
-        
-        SDLActivity.initialize();
-        // So we can call stuff from static callbacks
-        mSingleton = this;
-
-        // Set up the surface
-        mSurface = new SDLSurface(getApplication());
-        
-        if(Build.VERSION.SDK_INT >= 12) {
-            mJoystickHandler = new SDLJoystickHandler_API12();
-        }
-        else {
-            mJoystickHandler = new SDLJoystickHandler();
-        }
-
-        mLayout = new AbsoluteLayout(this);
-        mLayout.addView(mSurface);
-
-        setContentView(mLayout);
+       
+				startNative();
     }
 
     // Events
@@ -153,28 +136,59 @@ public class SDLActivity extends Activity {
         SDLActivity.nativeLowMemory();
     }
 
+    /** Ends the native thread.
+     */
+    public void resetNative() {
+      Log.v("SDL", "resetNative()");
+
+      // Send a quit message to the application
+      SDLActivity.mExitCalledFromJava = true;
+      SDLActivity.nativeQuit();
+
+      // Now wait for the SDL thread to quit
+      if (SDLActivity.mSDLThread != null) {
+        try {
+          SDLActivity.mSDLThread.join();
+        } catch(Exception e) {
+          Log.v("SDL", "Problem stopping thread: " + e);
+        }
+        SDLActivity.mSDLThread = null;
+
+        //Log.v("SDL", "Finished waiting for SDL thread");
+      }
+
+      SDLActivity.initialize();
+    }
+
+    public void startNative() {
+      Log.v("SDL", "startNative()");
+      SDLActivity.initialize();
+      // So we can call stuff from static callbacks
+      mSingleton = this;
+
+      // Set up the surface
+      mSurface = new SDLSurface(getApplication());
+
+      if(Build.VERSION.SDK_INT >= 12) {
+        mJoystickHandler = new SDLJoystickHandler_API12();
+      }
+      else {
+        mJoystickHandler = new SDLJoystickHandler();
+      }
+
+      mLayout = new AbsoluteLayout(this);
+      mLayout.addView(mSurface);
+
+      setContentView(mLayout);
+    }
+
     @Override
     protected void onDestroy() {
         Log.v("SDL", "onDestroy()");
-        // Send a quit message to the application
-        SDLActivity.mExitCalledFromJava = true;
-        SDLActivity.nativeQuit();
 
-        // Now wait for the SDL thread to quit
-        if (SDLActivity.mSDLThread != null) {
-            try {
-                SDLActivity.mSDLThread.join();
-            } catch(Exception e) {
-                Log.v("SDL", "Problem stopping thread: " + e);
-            }
-            SDLActivity.mSDLThread = null;
-
-            //Log.v("SDL", "Finished waiting for SDL thread");
-        }
+				resetNative();
             
         super.onDestroy();
-        // Reset everything in case the user re opens the app
-        SDLActivity.initialize();
     }
 
     @Override

+ 21 - 6
src/org/love2d/android/GameActivity.java

@@ -46,9 +46,26 @@ public class GameActivity extends SDLActivity {
       context = this.getApplicationContext();
       vibrator = (Vibrator) this.context.getSystemService(Context.VIBRATOR_SERVICE);
 
-      Uri game = this.getIntent().getData();
+      handleIntent (this.getIntent());
+
+      super.onCreate(savedInstanceState);
+      getWindowManager().getDefaultDisplay().getMetrics(metrics);
+    }
+
+    @Override
+    protected void onNewIntent (Intent intent) {
+      Log.d("GameActivity", "onNewIntent() with " + intent);
+      handleIntent (intent);
+      resetNative();
+      startNative();
+    };
+
+    protected void handleIntent (Intent intent) {
+      Uri game = intent.getData();
       if (game != null) {
         if (game.getScheme().equals ("file")) {
+          Log.d("GameActivity", "Received intent with path: " + game.getPath());
+
           // If we were given the path of a main.lua then use its
           // directory. Otherwise use full path.
           List<String> path_segments = game.getPathSegments();
@@ -60,12 +77,10 @@ public class GameActivity extends SDLActivity {
         } else {
           copyGameToCache (game);
         }
-        Log.d("GameActivity", "Opening game from: " + getGamePath());
-      }
 
-      super.onCreate(savedInstanceState);
-      getWindowManager().getDefaultDisplay().getMetrics(metrics);
-    }
+        Log.d("GameActivity", "new gamePath: " + gamePath);
+      }
+    };
 
     @Override
     protected void onDestroy() {