Attività di Android in Eclipse / ADT con le dependencies di progetto (risolvere il problema XY)

Ho cercato di mantenere un progetto di gioco piuttosto indipendente dalla piattaforma, per cui ho diviso in tre progetti dal basso livello al livello superiore Android specifico come quello: motore, gioco, android.

Le classi / interfacce coinvolte nell'errore sono quelle:

  • Come call un'applicazione Android da un'altra applicazione Android
  • Come leggere il tag NFC?
  • EditText: come abilitare / disabilitare l'input?
  • Utilizzo di tipi di build in Gradle per eseguire la stessa applicazione che utilizza ContentProvider su un dispositivo
  • Possibile sovrascrivere / applicare lo stile nel layout incluso con il tag <include>?
  • Qual è la differenza tra Long e Long in codice android?
    1. (basso livello) definisce questa interface:

      com.myteam.engine.IGame 
    2. (livello intermedio) il progetto di gioco indipendente di piattaforma definisce quelle classi:

       com.myteam.myproject.Game com.myteam.myproject.MyProject (derived from com.myteam.myproject.Game) 
    3. (top level) progetto android implementa attività, ecc .:

       com.myteam.myproject.android.MyAndroidActivity (using com.myteam.myproject.MyProject) 

    Tutto si compila bene e funziona perfettamente sotto Windows (con un altro progetto Windows al livello 3 usando i primi due).

    Ma quando si esegue con ADT esso non riesce all'esecuzione quando l'attività viene avviata. L'applicazione Android mostra semplicemente una stack di chiamata con un'exception "NoClassDefFoundError com.myteam.myproject.MyProject".

    L'exception sembra essere causata dalla sua super class (o dall'interface di super class) durante il caricamento / risoluzione come l'output LogCat rivela:

     12-20 19:51:51.897: D/ddm-heap(218): Got feature list request 12-20 19:51:52.207: I/dalvikvm(218): Failed resolving Lcom/myteam/myproject/Game; interface 18 'Lcom/myteam/engine/IGame;' 12-20 19:51:52.217: W/dalvikvm(218): Link of class 'Lcom/myteam/myproject/Game;' failed 12-20 19:51:52.227: W/dalvikvm(218): Unable to resolve superclass of Lcom/myteam/myproject/MyProject; (52) 12-20 19:51:52.227: W/dalvikvm(218): Link of class 'Lcom/myteam/myproject/MyProject;' failed 12-20 19:51:52.227: E/dalvikvm(218): Could not find class 'com.myteam.myproject.MyProject', referenced from method com.myteam.myproject.android.MyAndroidActivity.onCreate 12-20 19:51:52.227: W/dalvikvm(218): VFY: unable to resolve new-instance 54 (Lcom/myteam/myproject/MyProject;) in Lcom/myteam/myproject/android/Youcode_AndroidActivity; 12-20 19:51:52.227: D/dalvikvm(218): VFY: replacing opcode 0x22 at 0x0008 12-20 19:51:52.227: D/dalvikvm(218): Making a copy of Lcom/myteam/myproject/android/Youcode_AndroidActivity;.onCreate code (88 bytes) 

    Ho provato ad aggiungere i due primi progetti sotto le impostazioni del progetto "Build Path / Order and Export" Eclipse del progetto di gioco android come descritto in altri post e forum ma non cambia niente.

    La mia convinzione è che le impostazioni del Manifesto o del progetto richiedono un'altra menzione delle dependencies del pacchetto / class per l'imballaggio o il run-time di apk. Qualche idea?

    7 Solutions collect form web for “Attività di Android in Eclipse / ADT con le dependencies di progetto (risolvere il problema XY)”

    Ho un'applicazione Android / Java a tre livelli, quasi uguale a te:

    1. Progetto Java solo per la comunicazione di networking a basso livello
    2. Progetto Java solo per estrarre le caratteristiche del progetto a basso livello
    3. App Android

    Ciascuna cosa sopra è un progetto Eclipse separato contenuto in un unico spazio di lavoro.

    Ecco cosa devi fare:

    1. Nelle properties; del progetto Applicazione-> Java Build Path-> Progetti, aggiungere i progetti solo Java
    2. Nelle properties; del progetto App-> Java Build Path-> Ordine ed Esport, controllare i progetti solo Java (che li indicano per l'esportzione)

    Adesso la tua applicazione dovrebbe creare ed eseguire senza eccezioni di VFY o errori VFY come nel seguente esempio:

     03-27 21:10:17.120: W/dalvikvm(420): VFY: unable to find class referenced in signature (Labstractionlayer/BaseStationManager;) 03-27 21:10:17.120: W/dalvikvm(420): VFY: unable to find class referenced in signature (Labstractionlayer/BaseStationManager;) 03-27 21:10:17.160: I/dalvikvm(420): Failed resolving Lcom/demo/log/AndroidLogWrapper; interface 253 'Lcommon/Logger/LogWrapper;' 03-27 21:10:17.160: W/dalvikvm(420): Link of class 'Lcom/demo/log/AndroidLogWrapper;' failed 03-27 21:10:17.160: E/dalvikvm(420): Could not find class 'com.demo.log.AndroidLogWrapper', referenced from method com.demo.Application.onCreate 03-27 21:10:17.160: W/dalvikvm(420): VFY: unable to resolve new-instance 218 (Lcom/demo/log/AndroidLogWrapper;) in Lcom/demo/Application; 03-27 21:10:17.170: D/dalvikvm(420): VFY: replacing opcode 0x22 at 0x0003 03-27 21:10:17.170: D/dalvikvm(420): VFY: dead code 0x0005-003c in Lcom/demo/Application;.onCreate ()V 03-27 21:10:17.170: D/AndroidRuntime(420): Shutting down VM 03-27 21:10:17.170: W/dalvikvm(420): threadid=1: thread exiting with uncaught exception (group=0x40015560) 03-27 21:10:17.180: E/AndroidRuntime(420): FATAL EXCEPTION: main 03-27 21:10:17.180: E/AndroidRuntime(420): java.lang.NoClassDefFoundError: com.demo.log.AndroidLogWrapper 

    BTW, prima di ADT r17, è sufficiente eseguire il passaggio 1 sopra (aggiungere i progetti solo Java). Ma a partire da r17, è necessario anche fare il passo 2 (contrassegnare i progetti solo per l'esportzione di Java).

    Aggiungere il nome dei progetti dipendenti al file .claspath del tuo progetto android. come quello:

     <?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" path="src"/> <classpathentry kind="src" path="gen"/> <classpathentry combineaccessrules="false" kind="src" path="/DependentProject1"/> <classpathentry combineaccessrules="false" kind="src" path="/DependentProject2"/> <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/> <classpathentry kind="output" path="bin"/> </classpath> 

    Ho cercato di trovare una soluzione semplice per questo tempo fa, per quanto posso dirlo, l'unico modo per fare l'ADT esportre l'apk finale con le classi di libreria dipendenti è esplicitamente aggiungere tutto il tuo lib.jar esterno (generato dal tuo altri progetti) nel path di costruzione del tuo progetto Android.

    La versione attuale del plugin ADT di Eclipse ha un ciclo di vita predefinito (in particolare nel passaggio dexing) molto inflessibile, apparentemente non support il raggruppamento di progetti diversi da quelli di tre tipi di Android Project insieme (classico, libreria e test). In altre parole, ADT non sa come build il tuo progetto Android con un progetto regolarmente dipendente dal java sotto il path di creazione e aggiungere automaticamente il file lib.jar generato dal progetto dipendente nel path di creazione del progetto principale (anche se li aggiungete all'ordine e l'elenco di esportzione), a less che non esplicitamente aggiungere il lib.jar esterno. Supponiamo di aggiungere C: \ workspace \ game \ target \ game.jar e C: \ workspace \ engine \ target \ engine.jar nel path di build del tuo progetto android-game, il command per generare il file dex dovrebbe essere qualcosa di simile:

     java [-Xmx1024M, -jar, C:\android-sdk-r16\platform-tools\lib\dx.jar, --dex, --output=C:\workspace\android-game\target\classs.dex, C:\workspace\android-game\target\classs, C:\workspace\game\target\game.jar, C:\workspace\engine\target\engine.jar] 

    Se si prevede di adottare alcuni strumenti di build esterni per gestire il ciclo di vita del progetto, so che Maven fornisce configurazioni più flessibili sul ciclo di vita di Android. Support il progetto multi-module (raggruppamento di progetti) e può gestire correttamente la dipendenza del progetto Java.

    La mia conoscenza è basata su Eclipse, In attesa di sentire alcuni rumori da sorgente Android o altro sofisticato utente IDE.

    Aggiornamento da ADT 17.0.0:

    L'ultima versione SDK r17 con ADT 17.0.0 afferma di gestire correttamente questi casi di utilizzo:

    Eclipse cambiamenti specifici

    Il contenitore dinamico classpath chiamato "Library Projects" è stato rinominato in "Dependencies Android", in quanto contiene più di un semplice progetto di libreria.

    Il contenitore sarà ora popolato anche con i progetti solo Java che vengono citati da Library Projects. Se questi progetti Java fanno riferimento anche ad altri progetti Java e / oi file jar, verranno aggiunti automaticamente (anche i file jar citati dalle librerie utente sono supportti).

    Importnte: questo accade solo se i riferimenti sono impostati per essere esportti nel progetto di riferimento. Notare che questo non è l'impostazione predefinita quando si aggiunge un file di progetto o di jar a un path di creazione del progetto. I progetti di libreria (e il contenuto dei loro file libs / *. Jar) vengono sempre esportti. Questa modifica impatta solo i progetti solo Java e i propri file jar.

    Di nuovo, i duplicati (sia i progetti che i file jar) vengono rilevati e rimossi.

    Controlla il changelog .

    Ho trovato questo thread e ha funzionato per me solo assicurarsi di controllare il progetto dependentpro

    Testare il progetto Android con dependencies di jar

    Il path Java Build del progetto a metà livello include il progetto a basso livello, immagino. Avete controllato il progetto a basso livello per lì (scheda "Ordine e esportzione")? Altrimenti, la dipendenza del progetto a basso livello non viene inoltrata al progetto ad alto livello, escludendo IGame dall'APK, che in realtà innesca l'errore.

    Tuttavia, questa soluzione AFAIK non functionrà se i tuoi progetti contengono cose specifiche per Android, quali risorse e simili.

    Dubito di te e del tuo progetto. Dal mio punto di vista, vedo che hai un buon design. Ma perché stai lavorando con il Build Path / Order and Export ? Onestamente non sono mai andato a quella scheda sin dal primo giorno che ho lavorato con Eclipse.

    Per importre i file jar come librerie, utilizzare le tabs Libraries -> aggiungere Jars esterni.

    E mi dispiace che non so di programmazione del gioco, questo è solo un suggerimento: assicuratevi che il tuo motore sia adatto a quello che Android support. Ad esempio Android non support javax.imageio . In caso contrario, l'applicazione può essere compilata con vasi esterni, ma può essere schiantata in fase di runtime.

    So che è una vecchia domanda, ma ho trovato un nuovo modo di affrontare questo errore che potrebbe aiutare gli altri con gli aggiornamenti recenti.

    Ho ottenuto questo errore dall'utilizzo di un'istruzione switch / case sull'esempio R.id. "costanti". Gli aggiornamenti più recenti non considerano più le dichiarazioni R.java come costanti nel codice anche se dichiarate come definitive. Quello che succede è che il .apk compilerà e installi, ma produce quegli errori Lcom.

    Per risolvere questo problema (in Eclipse) è posizionato il cursore alla dichiarazione di commutazione e utilizzare Ctrl + 1 per convertire l' interruttore in un elenco di se altrimenti . Nota se si dispone di interruzioni nidificate all'interno di un'istanza di caso , è necessario riscrivere quel block di codice (probabilmente con altri oggetti).

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.