2016-06-14 10 views
5

Sto provando a creare un'applicazione Android in grado di verificare un volto Ma quando provo a eseguire la mia app sul mio emulatore (utilizzando Eclipse), ho questo risultato nel mio logcat:java.lang.ExceptionInInitializerError in Android

 06-16 14:51:24.326: E/AndroidRuntime(4305): FATAL EXCEPTION: main 
06-16 14:51:24.326: E/AndroidRuntime(4305): Process: com.neurotec.samples.faceverification, PID: 4305 
06-16 14:51:24.326: E/AndroidRuntime(4305): java.lang.ExceptionInInitializerError 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at com.neurotec.view.NGui.<clinit>(NGui.java:56) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at com.neurotec.view.NViewBase.<clinit>(NViewBase.java:30) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at java.lang.reflect.Constructor.constructNative(Native Method) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at android.view.LayoutInflater.createView(LayoutInflater.java:594) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:755) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at android.view.LayoutInflater.inflate(LayoutInflater.java:353) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:341) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at android.app.Activity.setContentView(Activity.java:1975) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at com.neurotec.samples.faceverification.FaceVerificationApplication.onCreate(FaceVerificationApplication.java:46) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at android.app.Activity.performCreate(Activity.java:5370) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2331) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2422) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at android.app.ActivityThread.access$800(ActivityThread.java:151) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1342) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at android.os.Handler.dispatchMessage(Handler.java:110) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at android.os.Looper.loop(Looper.java:193) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at android.app.ActivityThread.main(ActivityThread.java:5330) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at java.lang.reflect.Method.invoke(Method.java:515) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:828) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:644) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at dalvik.system.NativeStart.main(Native Method) 
06-16 14:51:24.326: E/AndroidRuntime(4305): Caused by: java.lang.ExceptionInInitializerError 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at com.neurotec.media.NMedia.<clinit>(NMedia.java:49) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at com.neurotec.view.NGui.<clinit>(NGui.java:47) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  ... 26 more 
06-16 14:51:24.326: E/AndroidRuntime(4305): Caused by: java.lang.ExceptionInInitializerError 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at com.neurotec.lang.NCore.<clinit>(NCore.java:140) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at com.neurotec.lang.NTypes.<clinit>(NTypes.java:171) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at com.neurotec.media.NMedia.<clinit>(NMedia.java:46) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  ... 27 more 
06-16 14:51:24.326: E/AndroidRuntime(4305): Caused by: java.lang.NoClassDefFoundError: com.sun.jna.Platform 
06-16 14:51:24.326: E/AndroidRuntime(4305):  at com.neurotec.lang.NCore.<clinit>(NCore.java:123) 
06-16 14:51:24.326: E/AndroidRuntime(4305):  ... 29 more 

Il codice per FaceVerificationApplication.java è la seguente:

public class FaceVerificationApplication extends BaseActivity implements 
     EnrollmentDialogListener, UserSelectionListener { 

    // =========================================================== 
    // Private fields 
    // =========================================================== 

    private static final String EXTRA_REQUEST_CODE = "request_code"; 
    private static final int VERIFICATION_REQUEST_CODE = 1; 
    private static final int TIMEOUT = 60000; 
    private boolean mAppClosing; 
    private NFaceVerificationView mFaceView; 

    // =========================================================== 
    // Protected methods 
    // =========================================================== 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_nlvdemo); 
     // on application start you must set NCore context 
     NCore.setContext(this); 

     new Thread(new Runnable() { 

      @Override 
      public void run() { 
       try { 
        showProgress(R.string.msg_initialising); 

        // get NFV for the first time 
        final NFaceVerification nfv = NFV.getInstance(); 

        // load settings 
        SettingsFragment.loadSettings(); 

        // button implementations 
        Button mEnrollButton = (Button) findViewById(R.id.button_enroll); 
        mEnrollButton 
          .setOnClickListener(new View.OnClickListener() { 

           @Override 
           public void onClick(View v) { 
            EnrollmentDialogFragment enrollDialog = new EnrollmentDialogFragment(); 
            enrollDialog.show(getFragmentManager(), 
              "enrollment"); 
           } 
          }); 

        Button mCancelButton = (Button) findViewById(R.id.button_cancel); 
        mCancelButton 
          .setOnClickListener(new View.OnClickListener() { 

           @Override 
           public void onClick(View v) { 
            showProgress(R.string.msg_cancelling); 
            nfv.cancel(); 
            hideProgress(); 
           } 
          }); 

        Button mVerifyButton = (Button) findViewById(R.id.button_verify); 
        mVerifyButton 
          .setOnClickListener(new View.OnClickListener() { 

           @Override 
           public void onClick(View v) { 
            Bundle bundle = new Bundle(); 
            bundle.putInt(EXTRA_REQUEST_CODE, 
              VERIFICATION_REQUEST_CODE); 
            UserListFragment userList = (UserListFragment) UserListFragment 
              .newInstance(nfv.getUsers(), true, 
                bundle); 
            userList.show(getFragmentManager(), 
              "verification"); 
           } 
          }); 

        // set frontal camera 
        String[] names = nfv.getAvailableCameraNames(); 
        for (String n : names) { 
         if (n.contains("Front")) { 
          nfv.setCamera(n); 
          break; 
         } 
        } 

        mFaceView = (NFaceVerificationView) findViewById(R.id.nFaceView); 
        nfv.addCapturePreviewListener(new NFaceVerificationCapturePreviewListener() { 

         @Override 
         public void capturePreview(
           NFaceVerificationCapturePreviewEvent arg0) { 
          mFaceView.setEvent(arg0); 
         } 
        }); 

        hideProgress(); 
       } catch (Exception ex) { 
        hideProgress(); 
        showError(ex); 
       } 
      } 

     }).start(); 
    } 

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

    @Override 
    public void onBackPressed() { 
     super.onBackPressed(); 
     mAppClosing = true; 
    } 

    @Override 
    public void onEnrollmentIDProvided(final String id) { 
     new Thread(new Runnable() { 

      @Override 
      public void run() { 
       try { 
        // cancel in there are any other operations in progress 
        NFV.getInstance().cancel(); 
        NFaceVerificationStatus status = NFV.getInstance().enroll(
          id, TIMEOUT, null); 
        showInfo(String.format(
          getString(R.string.msg_operation_status), 
          status.toString())); 
       } catch (Throwable e) { 
        showError(e); 
       } 
      } 
     }).start(); 
    }; 

    @Override 
    public void onUserSelected(final NFaceVerificationUser user, Bundle bundle) { 
     new Thread(new Runnable() { 

      @Override 
      public void run() { 
       try { 
        // cancel in there are any other operations in progress 
        NFV.getInstance().cancel(); 
        NFaceVerificationStatus status = NFV.getInstance().verify(
          user.getId(), TIMEOUT); 
        showInfo(String.format(
          getString(R.string.msg_operation_status), 
          status.toString())); 
       } catch (Throwable e) { 
        showError(e); 
       } 
      } 
     }).start(); 
    }; 

    @Override 
    protected void onStop() { 
     if (mAppClosing) { 
      NFV.getInstance().cancel(); 
      NFV.dispose(); 
     } 
     super.onStop(); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 
     if (id == R.id.action_clear_db) { 
      new Thread(new Runnable() { 

       @Override 
       public void run() { 
        // cancel if there are any other operations in progress 
        NFV.getInstance().cancel(); 
        NFV.getInstance().getUsers().clear(); 
       } 
      }).start(); 
      return true; 
     } else if (id == R.id.action_settings) { 
      Intent intent = new Intent(this, SettingsActivity.class); 
      startActivity(intent); 

      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

} 

come posso risolvere questa eccezione? Qualsiasi consiglio è di grande aiuto.

risposta

2

Ciao, i miei problemi hanno risolto. Devo aggiungere jna-4.2.2.jar nei miei progetti. Ho degli errori sulle librerie native in jna.jar. Quindi in questo caso, in Eclipse, devo andare a Preferenze> Android> Crea> deseleziona "Forza errore quando i barattoli esterni contengono librerie native". Quindi il mio problema è risolto.

0

Se sto leggendo questo diritto non può trovare una libreria per Java Native Access Platform

in Eclipse nelle proprietà del progetto controllare le librerie per JNA piattaforma

java.lang.ClassNotFoundException: com .sun.jna.Platform

Sono passati alcuni anni da quando ho usato eclipse.

+0

Si installa il file jna.jar? –

+0

http://stackoverflow.com/questions/2824515/how-to-add-external-library-properly-in-eclipse anche http://mvnrepository.com/artifact/net.java.dev.jna/jna -platform/4.1.0 –

+0

La domanda è stata modificata. Alcune modifiche devono essere inserite in un errore di eccezione. –

0

Potrebbe essere necessario aggiungere più dipendenze che possono essere qui https://github.com/java-native-access/jna/tree/master/lib se ho la libreria corretta.

Per fare ciò, fare clic con il tasto destro del mouse sul progetto in eclissi e quindi andare su Proprietà (dovrebbe essere l'opzione in basso).

Ci sono alcune opzioni a sinistra, scegliere "Percorso di costruzione Java". Qui è dove puoi aggiungere "Aggiungi barattoli" o "Aggiungi barattoli esterni". Se scegli Aggiungi jar esterno puoi installarlo da qualsiasi luogo, se scegli Aggiungi giare che puoi installare all'interno del progetto di cartella. Vorrei aggiungere una cartella jar all'interno della cartella del progetto e mettere tutte le dipendenze dei jar altrimenti, se si spostano i jar su un'altra cartella, è necessario farlo di nuovo.

Aggiungere tutti i barattoli dal collegamento e dai collegamenti secondari presenti. Vedi se questo risolve il problema. Eclipse ti dirà se ti mancano le dipendenze per le tue classi ma non ti dirà se le dipendenze mancano delle dipendenze finché non esegui il tuo codice.

+0

Devo importare tutto il file jar del collegamento fornito? –

+0

Sì, provalo e vedi se funziona. Anche come gli altri suggeriti, prova a scaricare il jar nella cartella dist troppo https://github.com/java-native-access/jna/tree/master/dist – applecrusher

+0

Ho scaricato tutto questo. Ma potrebbe ottenere questo errore Avviso –

0

Come già indicato da altri, si ha una dipendenza mancante in un progetto chiamato Java Native Access (JNA). Se osservi attentamente il tuo StackTrace, vedi questa eccezione: java.lang.NoClassDefFoundError: com.sun.jna.Platform. Una breve ricerca su Google è terminata nel repository sopra.

Proverei a download all related jars che hanno il prefisso Android. Potresti anche aver bisogno solo di android-arm.jar, ma questo potrebbe rompere i dispositivi con un altro processore, quindi aggiungili tutti.

0

Ecco le risposte, quindi sai come risolverlo ora. Ma questo è per gli altri. Java ha una eccezionale gestione dei messaggi di eccezione dove è possibile trovare quasi tutto ciò che è necessario per risolverlo. Questa è solo la mia opinione e consiglio: Ogni volta guarda CAUSATO DA: parte.

Se si dispone di un'eccezione, controllare l'ultima causata dal messaggio. Ad esempio, ecco: Causato da: java.lang.NoClassDefFoundError: com.sun.jna.Platform. Java ha un sacco di classi di errore. Questo è un errore da Object-> Throwable->Error-> LinkageError. Errore => Problema durante il runtime, Nessuna classe Errore trovato Def è un problema tipico per classloader. Tutto ciò di cui hai bisogno per spiegare l'errore è nei documenti java.


A proposito dei commenti nei commenti, ecco la soluzione per aggiungere una libreria esterna.

come aggiungere LIBRERIA proiettare in Eclipse: Scarica vaso che è decsribed da altri qui (jna.jar) e aggiungerlo al lib cartella e poi si deve aggiungere per costruire il percorso (poi classloader sarà in grado di trovarlo e risolverà il tuo problema). Se si utilizza Eclipse, è possibile importarli direttamente tramite Eclipse nella cartella lib (fare clic con il tasto destro sulla cartella del progetto, selezionare buildpath, scheda librerie e aggiungere jar) o copiare semplicemente jar direttamente nella cartella lib, quindi fare clic con il tasto destro e Build Path -> Aggiungi a Buildpath.

+0

Ho importato jna-platform-4.1.0.jar nel mio progetto ma ancora ottiene questo errore. –

+0

Hai ricompilato le tue dipendenze? – Hrabosch

+0

E magari scaricarli entrambi. jna.jar e jna-platform.jar, ecco JNA.jar http://search.maven.org/#artifactdetails%7Cnet.java.dev.jna%7Cjna%7C4.2.2%7C – Hrabosch