Explorar el Código

Android: fixed crash in harness if inputManager is not initialized yet

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7647 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
kim..ng hace 14 años
padre
commit
f02c21a51f

+ 8 - 12
engine/src/android/com/jme3/app/AndroidHarness.java

@@ -11,7 +11,6 @@ import android.view.Window;
 import android.view.WindowManager;
 
 import com.jme3.app.Application;
-import com.jme3.app.android.AndroidApplication;
 import com.jme3.input.TouchInput;
 import com.jme3.input.android.AndroidInput;
 import com.jme3.input.controls.TouchListener;
@@ -37,8 +36,7 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt
     protected String appClass = "jme3test.android.Test";
     protected Application app = null;
     
-    protected boolean debug = false;
-    
+    protected boolean debug = false;  
     final private String ESCAPE_EVENT = "TouchEscape";
 
     @Override
@@ -54,16 +52,14 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt
 
         AppSettings settings = new AppSettings(true);
         AndroidInput input = new AndroidInput(this);
-        
-        
-
+                
         // Create application instance
         try{
             @SuppressWarnings("unchecked")
             Class<? extends Application> clazz = (Class<? extends Application>) Class.forName(appClass);
             app = clazz.newInstance();
         }catch (Exception ex){
-            ex.printStackTrace();
+            handleError("Class " + appClass + " init failed", ex);
         }
 
         app.setSettings(settings);
@@ -77,10 +73,7 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt
         {
             view = ctx.createView(input);
         }
-   		setContentView(view);    
-   		
-        app.inputManager.addMapping(ESCAPE_EVENT, new TouchTrigger(TouchInput.KEYCODE_BACK));
-        app.inputManager.addListener(this, new String[]{ESCAPE_EVENT}); 
+   		setContentView(view);       		
     }
 
 
@@ -125,7 +118,10 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt
         logger.info("onDestroy");
     }
 
-    
+    public Application getJmeApplication()
+    {
+        return app;
+    }
     /**
      * Called when an error has occured. This is typically
      * invoked when an uncought exception is thrown in the render thread.

+ 18 - 3
engine/src/android/com/jme3/system/android/OGLESContext.java

@@ -39,11 +39,13 @@ import android.opengl.GLSurfaceView;
 import android.view.SurfaceHolder;
 
 import com.jme3.app.AndroidHarness;
+import com.jme3.app.Application;
 import com.jme3.input.JoyInput;
 import com.jme3.input.KeyInput;
 import com.jme3.input.MouseInput;
 import com.jme3.input.TouchInput;
 import com.jme3.input.android.AndroidInput;
+import com.jme3.input.controls.TouchTrigger;
 import com.jme3.input.dummy.DummyKeyInput;
 import com.jme3.input.dummy.DummyMouseInput;
 import com.jme3.renderer.android.OGLESShaderRenderer;
@@ -95,6 +97,8 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer
      */
     protected int clientOpenGLESVersion = 1;
     
+    final private String ESCAPE_EVENT = "TouchEscape";
+    
     public OGLESContext() { }
 
     @Override
@@ -352,10 +356,21 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer
         renderer.setVerboseLogging(false);
         
         renderer.initialize();
-        listener.initialize();                
-        created.set(true);
+        listener.initialize();
+        
+        // Setup exit hook
+        if (ctx instanceof AndroidHarness)
+        {
+            Application app = ((AndroidHarness)ctx).getJmeApplication();            
+            if (app.getInputManager() != null)
+            {
+                app.getInputManager().addMapping(ESCAPE_EVENT, new TouchTrigger(TouchInput.KEYCODE_BACK));
+                app.getInputManager().addListener((AndroidHarness)ctx, new String[]{ESCAPE_EVENT});
+            }
+        }
         
-        needClose.set(false);
+        created.set(true);        
+        needClose.set(false);    
     }
 
     /**