NoClassDefError android.security.MessageDigest Error
<p>Im following tutorials online in order to track currnet location. This is the code. 
Ive looked through lots of replies on this site yet i cant get it working. </p>

<p>main.xml</p>

<pre><code> &lt;RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
  tools:context=".MainActivity" &gt;

 &lt;fragment
     android:id="@+id/map"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     class="com.google.android.gms.maps.MapFragment" /&gt;

 &lt;/RelativeLayout&gt;  
</code></pre>

<p>android manifest.xml</p>

<pre><code>  &lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"
       package="in.wptrafficanalyzer.locationingooglemap"
       android:versionCode="1"
       android:versionName="1.0" &gt;

       &lt;uses-sdk
          android:minSdkVersion="4"
          android:targetSdkVersion="15" /&gt;

       &lt;uses-permission android:name="android.permission.INTERNET" /&gt;
       &lt;uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/&gt;

  &lt;application
      android:icon="@drawable/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme" &gt;

       &lt;uses-library android:name="com.google.android.maps" /&gt;

      &lt;activity
          android:name=".MainActivity"
          android:label="@string/title_activity_main" &gt;
          &lt;intent-filter&gt;
            &lt;action         android:name="android.intent.action.MAIN"
               /&gt;                                                                
            &lt;category android:name="android.intent.category.LAUNCHER" /&gt;
           &lt;/intent-filter&gt;
         &lt;/activity&gt;
      &lt;/application&gt;

     &lt;/manifest&gt;
</code></pre>

<p>currentlocationoverlay.java</p>

<pre><code>             package in.wptrafficanalyzer.locationingooglemap;
             import java.util.ArrayList;
             import android.graphics.drawable.Drawable;
             import android.util.Log;
             import com.google.android.maps.ItemizedOverlay;
             import com.google.android.maps.OverlayItem;

         public class CurrentLocationOverlay extends ItemizedOverlay&lt;OverlayItem&gt; {

     private ArrayList&lt;OverlayItem&gt; mOverlays = new ArrayList&lt;OverlayItem&gt;();

     public CurrentLocationOverlay(Drawable defaultMarker) {
         super(boundCenterBottom(defaultMarker));       
           }

           // Executed, when populate() method is called
        @Override
            protected OverlayItem createItem(int arg0) {
    return mOverlays.get(arg0);     
             }

             @Override
           public int size() {      
    return mOverlays.size();
         }

     public void addOverlay(OverlayItem overlay){
    mOverlays.add(overlay);
    populate(); // Calls the method createItem()
        }

      @Override
    protected boolean onTap(int arg0) {
    Log.d("Tapped", mOverlays.get(arg0).getSnippet());
    return true;
    }
        }
</code></pre>

<p>mainactivity.java</p>

<pre><code>    package in.wptrafficanalyzer.locationingooglemap;
    import java.util.List;
    import android.graphics.drawable.Drawable;
    import android.location.Criteria;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.os.Bundle;
    import android.view.Menu;
    import android.widget.TextView;
    import com.google.android.maps.GeoPoint;
    import com.google.android.maps.MapActivity;
    import com.google.android.maps.MapController;
    import com.google.android.maps.MapView;
    import com.google.android.maps.Overlay;
    import com.google.android.maps.OverlayItem;

    public class MainActivity extends MapActivity implements LocationListener {

   private MapView mapView;

     @Override
      public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);

       // Getting reference to MapView
    mapView = (MapView) findViewById(R.id.map);

    // Setting Zoom Controls on MapView
    mapView.setBuiltInZoomControls(true);


    // Getting LocationManager object from System Service LOCATION_SERVICE
    LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

    // Creating a criteria object to retrieve provider
    Criteria criteria = new Criteria();

    // Getting the name of the best provider
    String provider = locationManager.getBestProvider(criteria, true);

    // Getting Current Location
    Location location = locationManager.getLastKnownLocation(provider);

    if(location!=null){
        onLocationChanged(location);
    }

    locationManager.requestLocationUpdates(provider, 20000, 0, this);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

@Override
protected boolean isRouteDisplayed() {
    // TODO Auto-generated method stub
    return false;
}

@Override
public void onLocationChanged(Location location) {
    TextView tvLocation = (TextView) findViewById(R.id.map);

    // Getting latitude
    double latitude = location.getLatitude();

    // Getting longitude
    double longitude = location.getLongitude();

    // Setting latitude and longitude in the TextView tv_location
    tvLocation.setText("Latitude:" +  latitude  + ", Longitude:"+ longitude );

    // Creating an instance of GeoPoint corresponding to latitude and longitude
    GeoPoint point = new GeoPoint((int)(latitude * 1E6), (int)(longitude*1E6));

    // Getting MapController
    MapController mapController = mapView.getController();

    // Locating the Geographical point in the Map
    mapController.animateTo(point);

    // Applying a zoom
    mapController.setZoom(15);

    // Redraw the map
    mapView.invalidate();

    // Getting list of overlays available in the map
    List&lt;Overlay&gt; mapOverlays = mapView.getOverlays();

    // Creating a drawable object to represent the image of mark in the map
    Drawable drawable = this.getResources().getDrawable(R.drawable.cur_position);

    // Creating an instance of ItemizedOverlay to mark the current location in the map
    CurrentLocationOverlay currentLocationOverlay = new CurrentLocationOverlay(drawable);

    // Creating an item to represent a mark in the overlay
    OverlayItem currentLocation = new OverlayItem(point, "Current Location", "Latitude : " + latitude + ", Longitude:" + longitude);

    // Adding the mark to the overlay
    currentLocationOverlay.addOverlay(currentLocation);

    // Clear Existing overlays in the map
    mapOverlays.clear();

    // Adding new overlay to map overlay
    mapOverlays.add(currentLocationOverlay);        

}

@Override
public void onProviderDisabled(String provider) {
    // TODO Auto-generated method stub      
}

@Override
public void onProviderEnabled(String provider) {
    // TODO Auto-generated method stub      
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub      
}
     }
</code></pre>

<p>This is my logcat log</p>

<pre><code>   03-01 10:31:12.257: I/dalvikvm(18886): threadid=3: reacting to signal 3
   03-01 10:31:12.267: I/dalvikvm(18886): Wrote stack traces to '/data/anr/traces.txt'
   03-01 10:31:12.367: I/dalvikvm(18886): Could not find method android.security.MessageDigest.getInstance, referenced from method com.google.android.maps.KeyHelper.getSignatureFingerprint
   03-01 10:31:12.367: W/dalvikvm(18886): VFY: unable to resolve static method 153: Landroid/security/MessageDigest;.getInstance (Ljava/lang/String;)Landroid/security/MessageDigest;
   03-01 10:31:12.367: D/dalvikvm(18886): VFY: replacing opcode 0x71 at 0x0038
   03-01 10:31:12.377: D/AndroidRuntime(18886): Shutting down VM
   03-01 10:31:12.377: W/dalvikvm(18886): threadid=1: thread exiting with uncaught exception (group=0x40a2a1f8)
   03-01 10:31:12.397: E/AndroidRuntime(18886): FATAL EXCEPTION: main
   03-01 10:31:12.397: E/AndroidRuntime(18886): java.lang.NoClassDefFoundError: android.security.MessageDigest
   03-01 10:31:12.397: E/AndroidRuntime(18886):     at com.google.android.maps.KeyHelper.getSignatureFingerprint(KeyHelper.java:60)
   03-01 10:31:12.397: E/AndroidRuntime(18886):     at com.google.android.maps.MapActivity.createMap(MapActivity.java:552)
   03-01 10:31:12.397: E/AndroidRuntime(18886):     at com.google.android.maps.MapActivity.onCreate(MapActivity.java:422)
   03-01 10:31:12.397: E/AndroidRuntime(18886):     at in.wptrafficanalyzer.locationingooglemap.MainActivity.onCreate(MainActivity.java:26)
   03-01 10:31:12.397: E/AndroidRuntime(18886):     at android.app.Activity.performCreate(Activity.java:4492)
   03-01 10:31:12.397: E/AndroidRuntime(18886):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
   03-01 10:31:12.397: E/AndroidRuntime(18886):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
   03-01 10:31:12.397: E/AndroidRuntime(18886):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
   03-01 10:31:12.397: E/AndroidRuntime(18886):     at android.app.ActivityThread.access$600(ActivityThread.java:123)
   03-01 10:31:12.397: E/AndroidRuntime(18886):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
   03-01 10:31:12.397: E/AndroidRuntime(18886):     at android.os.Handler.dispatchMessage(Handler.java:99)
   03-01 10:31:12.397: E/AndroidRuntime(18886):     at android.os.Looper.loop(Looper.java:137)
   03-01 10:31:12.397: E/AndroidRuntime(18886):     at android.app.ActivityThread.main(ActivityThread.java:4424)
   03-01 10:31:12.397: E/AndroidRuntime(18886):     at java.lang.reflect.Method.invokeNative(Native Method)
   03-01 10:31:12.397: E/AndroidRuntime(18886):     at java.lang.reflect.Method.invoke(Method.java:511)
   03-01 10:31:12.397: E/AndroidRuntime(18886):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
   03-01 10:31:12.397: E/AndroidRuntime(18886):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
   03-01 10:31:12.397: E/AndroidRuntime(18886):     at dalvik.system.NativeStart.main(Native Method)
   03-01 10:31:12.747: I/dalvikvm(18886): threadid=3: reacting to signal 3
   03-01 10:31:12.757: I/dalvikvm(18886): Wrote stack traces to '/data/anr/traces.txt'
  03-01 10:31:12.957: I/dalvikvm(18886): threadid=3: reacting to signal 3
  03-01 10:31:12.967: I/dalvikvm(18886): Wrote stack traces to '/data/anr/traces.txt'
  03-01 10:31:16.197: I/Process(18886): Sending signal. PID: 18886 SIG: 9
</code></pre>

<p>Thanks in advance</p>

<hr>

<p>MessageDigest.java</p>

<p>import java.security.NoSuchAlgorithmException;</p>

<p>public class MessageDigest
{
    private java.security.MessageDigest instance;</p>

<pre><code>public MessageDigest() {}

private MessageDigest(java.security.MessageDigest instance)
{
    this.instance = instance;
}

public static MessageDigest getInstance(String algorithm) throws NoSuchAlgorithmException
{
    if (algorithm == null) return null;

    try
    {
        if (algorithm.equals("SHA-1"))
            return (MessageDigest) Class.forName("android.security.Sha1MessageDigest").newInstance();
        else if (algorithm.equals("MD5"))
            return (MessageDigest) Class.forName("android.security.Md5MessageDigest").newInstance();
    }
    catch (Exception e) {}

    return new MessageDigest(java.security.MessageDigest.getInstance(algorithm));
}

public void update(byte[] input)
{
    instance.update(input);
}

public byte[] digest()
{
    return instance.digest();
}

public byte[] digest(byte[] input)
{
    return instance.digest(input);
}
</code></pre>

<p>}</p>
