Autore Topic: Errore java.lang.NoClassDefFoundError.. come risolvere?  (Letto 3459 volte)

Offline seriud89

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Errore java.lang.NoClassDefFoundError.. come risolvere?
« il: 30 Gennaio 2013, 11:39:33 CET »
0
Ciao a tutti! Sto sviluppando una app che utilizza il webservice Microsoft Hawaii per l'estrazione del testo da un'immagine!
Dopo che scatto una foto e cerco di inviarla al web service, l'app crasha, portandomi questo errore nel logcat:

01-30 11:34:35.390: E/AndroidRuntime(11993): FATAL EXCEPTION: main
01-30 11:34:35.390: E/AndroidRuntime(11993): java.lang.NoClassDefFoundError: your.Mobile.RecognitionActivity
01-30 11:34:35.390: E/AndroidRuntime(11993):    at your.Mobile.FotocameraActivity.onActivityResult(FotocameraActivity.java:135)
01-30 11:34:35.390: E/AndroidRuntime(11993):    at android.app.Activity.dispatchActivityResult(Activity.java:4820)
01-30 11:34:35.390: E/AndroidRuntime(11993):    at android.app.ActivityThread.deliverResults(ActivityThread.java:2980)
01-30 11:34:35.390: E/AndroidRuntime(11993):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3027)
01-30 11:34:35.390: E/AndroidRuntime(11993):    at android.app.ActivityThread.access$1100(ActivityThread.java:127)
01-30 11:34:35.390: E/AndroidRuntime(11993):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1181)
01-30 11:34:35.390: E/AndroidRuntime(11993):    at android.os.Handler.dispatchMessage(Handler.java:99)
01-30 11:34:35.390: E/AndroidRuntime(11993):    at android.os.Looper.loop(Looper.java:137)
01-30 11:34:35.390: E/AndroidRuntime(11993):    at android.app.ActivityThread.main(ActivityThread.java:4476)
01-30 11:34:35.390: E/AndroidRuntime(11993):    at java.lang.reflect.Method.invokeNative(Native Method)
01-30 11:34:35.390: E/AndroidRuntime(11993):    at java.lang.reflect.Method.invoke(Method.java:511)
01-30 11:34:35.390: E/AndroidRuntime(11993):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:816)
01-30 11:34:35.390: E/AndroidRuntime(11993):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:583)
01-30 11:34:35.390: E/AndroidRuntime(11993):    at dalvik.system.NativeStart.main(Native Method)

L'errore si riferisce a questa Activity:
Codice (Java): [Seleziona]
public class FotocameraActivity extends Activity {
       
        // dati che servono per la fotocamera
    private static final int CAMERA_REQUEST = 100; // un numero a nostro
                                                                                                    // piacimento
    File tmpFotoFile = null;
    byte[] bitmapdata;
    ImageView preview;
    LocationManager locationManager;
    String gps;
    final static String ARRAY_BYTE = "ARRAY_BYTE";
    final static String GPS = "GPS";

    @Override
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            locationManager = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);
            if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
                startGpsTracking();
            }

            try {
                    launchCamera();
            } catch (IOException e) {
                    throw new RuntimeException(e);
            }
    }

    private void startGpsTracking() {
                // TODO Auto-generated method stub
                locationManager.addGpsStatusListener(gpsListener);
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 500, 3, myLocationListener);
        }

    private Listener gpsListener = new Listener(){
        public void onGpsStatusChanged(int status){
                switch(status){
                case GpsStatus.GPS_EVENT_FIRST_FIX:
                        Log.d(LOCATION_SERVICE,"onGpsStatusChanged First Fix");
                        break;
                case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
                        Log.d(LOCATION_SERVICE, "onGpsStatusChanged Satellite");
                        break;
                case GpsStatus.GPS_EVENT_STARTED:
                        Log.d(LOCATION_SERVICE, "onGpsStatusChanged Started");
                        break;
                case GpsStatus.GPS_EVENT_STOPPED:
                        Log.d(LOCATION_SERVICE, "onGpsStatusChanged Stopped");
                        break;
                }
        }
    };
   
    private LocationListener myLocationListener = new LocationListener(){

                public void onLocationChanged(Location location) {
                        // TODO Auto-generated method stub
                        double lng = location.getLongitude(), lat = location.getLatitude();
                        gps += String.format("%6f", lng) + "#" + String.format("%6f", lat);
                       
                }

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

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

                public void onStatusChanged(String provider, int status, Bundle extras) {
                        // TODO Auto-generated method stub
                       
                }
       
    };
   
        private void launchCamera() throws IOException {

            // Fase 1
            tmpFotoFile = File.createTempFile("OCRPic", null);

            Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tmpFotoFile));
            startActivityForResult(cameraIntent, CAMERA_REQUEST);
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

            if (requestCode == CAMERA_REQUEST) {
                    Bitmap datifoto = null;
                    try {
                            datifoto = android.provider.MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.fromFile(tmpFotoFile));
                    } catch (FileNotFoundException e) {
                            throw new RuntimeException(e);
                    } catch (IOException e) {
                            throw new RuntimeException(e);
                    }
                    ByteArrayOutputStream bos = new ByteArrayOutputStream();
                    datifoto.compress(Bitmap.CompressFormat.JPEG, 80, bos);
                    bitmapdata = bos.toByteArray();
                    tmpFotoFile.delete();

                    SimpleView view = new SimpleView(this, datifoto); // creo l'istanza
                                                                                                                            // // della                                                                                                       // view...
                    setContentView(view); // e la setto
                   
                    Intent intentRecognize = new Intent(this, RecognitionActivity.class); <-------A QUESTA RIGA SI RIFERISCE L'ERRORE
                    intentRecognize.putExtra(ARRAY_BYTE, bitmapdata);
                    intentRecognize.putExtra(GPS, gps);
                    startActivity(intentRecognize);
            }
           
    }
        }


class SimpleView extends View{

    private Bitmap bitmap;
    private Paint tmpPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
   
    public SimpleView(Context context, Bitmap bitmap) {
            super(context);
            this.bitmap = Bitmap.createScaledBitmap(bitmap,480,320,false);//ridimensiono l'
immagine
    }
   
    @Override
    protected void onDraw(Canvas canvas){
    super.onDraw(canvas);
    canvas.drawBitmap( bitmap, null , new Rect(0,0,getWidth(),getHeight()),tmpPaint);
    }
}

Ma l'activity RecognitionActivity è presente nel mio progetto ed è la seguente:
Codice (Java): [Seleziona]
public class RecognitionActivity extends HawaiiBaseAuthActivity {

        private Bundle extras;
        private LinearLayout resultContainer;
        private TextView ocrResultView;
        private AsyncTask<Void, Integer, AlertDialog.Builder> currentOcrTask;
       
        @SuppressWarnings("unused")
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_recognition);
               
                final RecognitionActivity thisActivity = this;
                extras = getIntent().getExtras();
                byte [] bitmapArray = extras.getByteArray(FotocameraActivity.ARRAY_BYTE);
                TextView tv = new TextView(thisActivity);
                tv.setText("Questa è una prova");
                tv.setVisibility(View.VISIBLE);
               
                class OcrTask extends AsyncTask<Void, Integer, AlertDialog.Builder> {
                        private OcrServiceResult serviceResult;
                       
                        protected void onPreExecute(){
                                TextView tv = new TextView(thisActivity);
                                tv.setText("Sto elaborando l'immagine...");
                                tv.setVisibility(View.VISIBLE);
                                ProgressBar progress = new ProgressBar(thisActivity);
                                progress.setVisibility(View.VISIBLE);
                        }
                       
                       
                        @Override
                        protected AlertDialog.Builder doInBackground(Void... params) {
                                // TODO Auto-generated method stub
                                extras = getIntent().getExtras();
                                byte [] bitmapArray = extras.getByteArray(FotocameraActivity.ARRAY_BYTE);
                               
                                try {
                                        OcrService.recognizeImage(thisActivity.getBaseApplication().getClientIdentity(), bitmapArray,
                                                        new OnCompleteListener<OcrServiceResult>() {

                                                        public void done(OcrServiceResult result){
                                                                serviceResult = result;}}, null);
                                } catch (Exception e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                                return null;
                        }
                       
                        protected void onPostExecute(AlertDialog.Builder dialogBuilder) {
                                if (dialogBuilder != null) {
                                        thisActivity.showErrorMessage(dialogBuilder);
                                } else {
                                       
                                        resultContainer.setVisibility(View.VISIBLE);
                                        List<OcrText> resultList = serviceResult.getOcrTexts();
                                        if (resultList.size() > 0) {
                                                String ocrResult = resultList.get(0).getText();
                                                if (!Utility.isStringNullOrEmpty(ocrResult)) {
                                                        ocrResultView.setText(ocrResult);
                                                } else {
                                                        thisActivity.showErrorMessage("Couldn't recognize the specified image",null);
                                                }
                                        }
                                }
                }
        }
        currentOcrTask = new OcrTask();
        currentOcrTask.execute();
               
}

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.activity_recognition, menu);
                return true;
        }

}

Tuttavia mi sono accorto che se metto tra commenti la classe interna, sembra funzionare!
Vi chiedo gentilmente di aiutarmi, perchè questo è il mio lavoro di tesi e sono da molto tempo bloccato a questo punto senza riuscire ad andare avanti!

Grazie mille davvero.

Sergio

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Errore java.lang.NoClassDefFoundError.. come risolvere?
« Risposta #1 il: 30 Gennaio 2013, 11:44:54 CET »
0
Se utilizzi delle librerie (ovvero dei jar) devi metterli nella cartella libs dell'applicazione.
La prossima volta ti consiglio di cercare nel forum in quanto si tratta di una cosa ampiamente discussa.

Offline seriud89

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Errore java.lang.NoClassDefFoundError.. come risolvere?
« Risposta #2 il: 30 Gennaio 2013, 11:55:51 CET »
0
ho già messo tutte le librerie all'interno della cartella libs, ma così facendo non è cambiato nulla!

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Errore java.lang.NoClassDefFoundError.. come risolvere?
« Risposta #3 il: 30 Gennaio 2013, 12:23:16 CET »
0
Ok,allora appurato che non è quello cerchiamo altre soluzioni.
Dov'è definita la classe "RecognitionActivity"?

Offline seriud89

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Errore java.lang.NoClassDefFoundError.. come risolvere?
« Risposta #4 il: 30 Gennaio 2013, 12:34:54 CET »
0
è definita nel file RecognitionActivity.java, mentre l'activity FotocameraActivity è definita nel file FotocameraActivity.java

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Errore java.lang.NoClassDefFoundError.. come risolvere?
« Risposta #5 il: 30 Gennaio 2013, 12:56:12 CET »
0
Ma quindi confermi che commentando la inner class OcrTask non si genera l'errore?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline seriud89

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Errore java.lang.NoClassDefFoundError.. come risolvere?
« Risposta #6 il: 30 Gennaio 2013, 13:11:03 CET »
0
si. commentando la inner class, il codice non da errore

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Errore java.lang.NoClassDefFoundError.. come risolvere?
« Risposta #7 il: 30 Gennaio 2013, 13:35:24 CET »
0
si. commentando la inner class, il codice non da errore

Questo dovrebbe escludere problemi di path o inclusioni. Potrebbe esserci il problema dell'AsyncTask non creato all'interno di un thread di UI, che fa fallire il classloader, ma non pare essere il caso.

Mi viene in mente una prova, molto probabilmente inutile, ma semplice e veloce da fare.

Prova a commentare tutto il contenuto dei metodi dell'asyncTask, lasciando solo lo scheletro con le onPreExeceute, doiInBackground e onPostExecute dichiarate, ma che non contengono codice. Vedi se a generare l'errore è la presenza dell'AsyncTask oppure ciò che dovrebbe eseguire.

NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Errore java.lang.NoClassDefFoundError.. come risolvere?
« Risposta #8 il: 30 Gennaio 2013, 14:01:13 CET »
0
io la inner class la metterei a livello di activity e non di metodo...
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline seriud89

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Errore java.lang.NoClassDefFoundError.. come risolvere?
« Risposta #9 il: 31 Gennaio 2013, 09:59:24 CET »
0
@bradipao, ho provato a commentare come hai detto tu, ma il problema e l'errore persistono: sempre l'errore NoClassDefFoundError, sempre alla stessa riga..
@Nicola_D, non posso metterla a livello di activity, perchè la inner class utilizza i servizi messi a disposizione dalla superclasse della classe esterna HawaiiBaseAuthActivity, e la inner class già estende un'altra classe, quindi non posso far ereditare alla inner class due superclassi..

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Errore java.lang.NoClassDefFoundError.. come risolvere?
« Risposta #10 il: 31 Gennaio 2013, 10:26:37 CET »
+1
@Nicola_D, non posso metterla a livello di activity, perchè la inner class utilizza i servizi messi a disposizione dalla superclasse della classe esterna HawaiiBaseAuthActivity, e la inner class già estende un'altra classe, quindi non posso far ereditare alla inner class due superclassi..

Penso volesse dire di "non dichiararla nella OnCreate".
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline seriud89

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Errore java.lang.NoClassDefFoundError.. come risolvere?
« Risposta #11 il: 31 Gennaio 2013, 11:20:28 CET »
0
Ho provato a dichiarare la inner class fuori dall' onCreate, ma l'errore non cambia.. ora l'errore si manifesta anche quando commento la inner class..!  :'(

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Errore java.lang.NoClassDefFoundError.. come risolvere?
« Risposta #12 il: 31 Gennaio 2013, 11:38:43 CET »
0
Ho provato a dichiarare la inner class fuori dall' onCreate, ma l'errore non cambia.. ora l'errore si manifesta anche quando commento la inner class..!  :'(

L'ultima parte della tua affermazione è illogica, come fa a dare errore una cosa che è commentata? Il fatto che sia commentata dentro o fuori OnCreate è irrilevante, sempre commentata è.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline seriud89

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Errore java.lang.NoClassDefFoundError.. come risolvere?
« Risposta #13 il: 31 Gennaio 2013, 11:54:05 CET »
0
L'errore viene rilevato nella Activity precedente alla RecognitionActivity, precisamente alla riga
Codice (Java): [Seleziona]
 Intent intentRecognize = new Intent(this, RecognitionActivity.class);come detto nel mio primo post.
Solo che prima, se commentavo la inner class( presente nella RecognitionActivity, cioè la Activity successiva a FotocameraActivity), mi stampava almeno a video la textView di prova, ora invece crasha direttamente.

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Errore java.lang.NoClassDefFoundError.. come risolvere?
« Risposta #14 il: 31 Gennaio 2013, 14:27:32 CET »
0
ma perchè c'è un "unused" sul metodo oncreate?
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia