I wrote an App which has a Launcher activity and two Map activities.
When I run it, one Map activity works like a dream, while the other crashes with a java.lang.NoClassDefFoundError. The one that crashes has a "Link of class failed" warning before I invoke it.
I have been through all the applicable solutions on SO and none seem to help.I have:
checked and rechecked the Android Manifest,
done all that was advised to do to the Java Build Path.
checked all the imports of the activity (that crashes) to see that they were not implemented after the android:minSdkVersion in the Manifest
Since my App uses com.google.android.maps.* classes I considered putting a
<uses-library android:name="com.google.android.maps" />
element in the Manifest, but that produced an
Installation error: INSTALL_FAILED_MISSING_SHARED_LIBRARY
which according to Commonsware, Mar 27 '14:
< You have a element in your manifest. Either
that should not be there, or
you are attempting to install the app on a device that does not have that library. >
I tried inserting the maps.jar into my device's folders manually but that didn't get rid of the error either.
So here is my code: Launcher Activity class (called Selector.class):
package com.thenewboston.googlemaps;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class Selector extends Activity implements View.OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.select_activity);
Button bMain = (Button)findViewById(R.id.button1);
Button bOther = (Button)findViewById(R.id.button2);
bMain.setOnClickListener(this);
bOther.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()){
case R.id.button1:
Intent main_intent = new Intent(this,MainActivity.class);
startActivity(main_intent);
break;
case R.id.button2:
Intent other_intent = new Intent(this,OtherActivity.class);
startActivity(other_intent);
break;
}
}
}
My 2nd Map Activity called OtherActivity.class (which crashes):
package com.thenewboston.googlemaps;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.drawable.Drawable;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.MotionEvent;
import android.widget.Toast;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;
public class OtherActivity extends MapActivity implements LocationListener{
MapView myMapView;
long start,stop;
int x,y;
GeoPoint touchedPoint;
Drawable d;
List<Overlay> overlayList;
LocationManager lm;
String towers;
@Override
protected void onCreate(Bundle arg0) {
// TODO Auto-generated method stub
super.onCreate(arg0);
setContentView(R.layout.otheractivity);
myMapView = (MapView)findViewById(R.id.mvMain);
myMapView.setBuiltInZoomControls(true);
TouchControls tc = new TouchControls(); // set instance of touch controls
@SuppressWarnings("unchecked")
List<Overlay> overlayList = (List<Overlay>)myMapView.getOverlay();
overlayList.add(tc);
d = getResources().getDrawable(R.drawable.ic_launcher);
// placing pinpoint at location
lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
int lat = 0;
int longi = 0;
GeoPoint ourLocation = new GeoPoint(lat,longi);
OverlayItem overlayItem = new OverlayItem(ourLocation,"What's up?","2nd string");
CustomPinpoints custom = new CustomPinpoints(d,OtherActivity.this);
custom.insertPinpoint(overlayItem);
overlayList.add(custom);
}
public class TouchControls extends Overlay{
// Point p;
AlertDialog alert;
@Override
public boolean onTouchEvent(MotionEvent arg0,
com.google.android.maps.MapView arg1) {
// TODO Auto-generated method stub
if (arg0.getAction() == MotionEvent.ACTION_DOWN){
start = arg0.getEventTime();
x = (int)arg0.getX();
y = (int)arg0.getY();
// p = new Point(x,y);
touchedPoint = myMapView.getProjection().fromPixels(x,y);
}
if (arg0.getAction() == MotionEvent.ACTION_UP){
stop = arg0.getEventTime();
}
if (stop - start > 1500){
alert = new AlertDialog.Builder(OtherActivity.this).create();
alert.setTitle("Pick an option");
alert.setMessage("I told you to pick an option");
int whichButton = 0;
alert.setButton(whichButton, "place a pinpoint",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
OverlayItem overlayItem = new OverlayItem(touchedPoint,"What's up?","2nd string");
CustomPinpoints custom = new CustomPinpoints(d,OtherActivity.this);
custom.insertPinpoint(overlayItem);
overlayList.add(custom);
}
} );
int whichButton2 = 0;
alert.setButton(whichButton2 ,"get address",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Geocoder geocoder = new Geocoder(getBaseContext(),Locale.getDefault());
try {
List<Address> address = geocoder.getFromLocation(touchedPoint.getLatitudeE6()/1E6, touchedPoint.getLongitudeE6()/1E6, 1);
String display = "";
if (address.size() > 0){
for(int i = 0; i < address.get(0).getMaxAddressLineIndex(); i++){
display += address.get(0).getAddressLine(i) + "\n";
}
Toast t = Toast.makeText(getBaseContext(), display, Toast.LENGTH_LONG);
t.show();
}
} catch (IOException e ){
e.printStackTrace();
} finally {
}
}
} );
int whichButton3 = 0;
alert.setButton(whichButton3 ,"Toggle View",new DialogInterface.OnClickListener() {
@SuppressWarnings("deprecation")
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
if (myMapView.isSatellite()){
myMapView.setSatellite(false);
myMapView.setStreetView(true);
} else {
myMapView.setStreetView(false);
myMapView.setSatellite(true);
}
}
} );
alert.show();
} //if 3
return false;
}
} // onTouchEvent
@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
@Override
public void onLocationChanged(Location arg0) {
// TODO Auto-generated method stub
}
@Override
public void onProviderDisabled(String arg0) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String arg0) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
}
The Manifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.thenewboston.googlemaps"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
"
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".Selector"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".OtherActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".CustomPinpoints"
android:label="@string/app_name" >
</activity>
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="whatever" />
</application>
My LogCat:
02-12 12:43:02.930: W/dalvikvm(14102): Unable to resolve superclass of Lcom/thenewboston/googlemaps/OtherActivity; (4650)
02-12 12:43:02.930: W/dalvikvm(14102): Link of class 'Lcom/thenewboston/googlemaps/OtherActivity;' failed
02-12 12:43:02.930: E/dalvikvm(14102): Could not find class 'com.thenewboston.googlemaps.OtherActivity', referenced from method com.thenewboston.googlemaps.Selector.onClick
02-12 12:43:02.930: W/dalvikvm(14102): VFY: unable to resolve const-class 4662 (Lcom/thenewboston/googlemaps/OtherActivity;) in Lcom/thenewboston/googlemaps/Selector;
02-12 12:44:10.200: D/AndroidRuntime(14102): Shutting down VM
02-12 12:44:10.200: W/dalvikvm(14102): threadid=1: thread exiting with uncaught exception (group=0x415e9ba8)
02-12 12:44:10.210: E/AndroidRuntime(14102): FATAL EXCEPTION: main
02-12 12:44:10.210: E/AndroidRuntime(14102): Process: com.thenewboston.googlemaps, PID: 14102
02-12 12:44:10.210: E/AndroidRuntime(14102): java.lang.NoClassDefFoundError: com.thenewboston.googlemaps.OtherActivity
02-12 12:44:10.210: E/AndroidRuntime(14102): at com.thenewboston.googlemaps.Selector.onClick(Selector.java:35)
02-12 12:44:10.210: E/AndroidRuntime(14102): at android.view.View.performClick(View.java:4438)
02-12 12:44:10.210: E/AndroidRuntime(14102): at android.view.View$PerformClick.run(View.java:18422)
02-12 12:44:10.210: E/AndroidRuntime(14102): at android.os.Handler.handleCallback(Handler.java:733)
02-12 12:44:10.210: E/AndroidRuntime(14102): at android.os.Handler.dispatchMessage(Handler.java:95)
02-12 12:44:10.210: E/AndroidRuntime(14102): at android.os.Looper.loop(Looper.java:136)
02-12 12:44:10.210: E/AndroidRuntime(14102): at android.app.ActivityThread.main(ActivityThread.java:5017)
02-12 12:44:10.210: E/AndroidRuntime(14102): at java.lang.reflect.Method.invokeNative(Native Method)
02-12 12:44:10.210: E/AndroidRuntime(14102): at java.lang.reflect.Method.invoke(Method.java:515)
02-12 12:44:10.210: E/AndroidRuntime(14102): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:813)
02-12 12:44:10.210: E/AndroidRuntime(14102): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
02-12 12:44:10.210: E/AndroidRuntime(14102): at dalvik.system.NativeStart.main(Native Method)
my App's Project Explorer
Any ideas about what to do?