2012-04-25 6 views
5

Ho scaricato un codice sorgente da una libreria per Android, l'ho compilato e ho ottenuto un file .jar, ho incluso nel mio progetto e ho provato ad usarlo ma io ricevo sempre un java.lang.NoClassDefFoundError, ho notato che nel file jar non ci sono file R $ XXX, ho letto questo post: Android Library Import delete R e ho provato le soluzioni ma nessuna ha funzionato per me.java.lang.NoClassDefFoundError con tutte le classi R durante l'utilizzo della libreria Android

Ho creato la mia libreria semplice e ho visto che entrambi i file R non sono inclusi nel jar, devo aggiungere manualmente i file .class usando winrar ma penso che manchi qualcosa di semplice, sto usando eclissi con ADT.

Grazie a tutti

risposta

7

Se si sta creando file jar allora non dovrebbe includere r.java, file di manifeast nel file jar.

Poiché il vaso non viene rispettato durante la compilazione e non crea alcun numero intero statico durante il tempo di compilazione.

In Android abbiamo Android LIbrary che è simile al progetto Android ma può essere incluso in altri progetti.

E se è ancora necessario avere il file jar, basta tenere i file di classe nel jar includendo tutte le risorse contenute nell'applicazione e dai file java è possibile utilizzare il codice sottostante per riferire le risorse durante il runtime.

Che è necessario utilizzare getResourseIdByName (getPackageName(), "drawable", "icon") anziché R.drawable.icon nel codice. Di seguito è riportato il codice per getResourceIdByName ::

public int getResourseIdByName(String packageName, String className, String name) { 
      int id = 0; 
     try { 
      for (int i = 0; i < Class.forName(packageName + ".R").getClasses().length; i++) { 
       if(Class.forName(packageName + ".R").getClasses()[i].getName().split("\\$")[1].equals(className)) { 
        if(Class.forName(packageName + ".R").getClasses()[i] != null) 
         id = Class.forName(packageName + ".R").getClasses()[i].getField(name).getInt(Class.forName(packageName + ".R").getClasses()[i]); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (SecurityException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } catch (NoSuchFieldException e) { 
      e.printStackTrace(); 
     } 
     return id; 
    } 
Problemi correlati