2015-10-09 12 views
10

Sto avendo qualche problema serio con questo codice, da svg-android:Android 6.0 (Marshmallow) ad eccezione di inizializzazione statico sul getDeclaredField()

public class ParserHelper { 

private static final Field STRING_CHARS; 
static { 
    try { 
     STRING_CHARS = String.class.getDeclaredField("value"); //<-- exception here 
     STRING_CHARS.setAccessible(true); 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
} 

private final char[] s; 
private final int n; 
private char current; 
public int pos; 

public ParserHelper(String str, int pos) { 
    try { 
     this.s = (char[]) STRING_CHARS.get(str); 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
    this.pos = pos; 
    n = s.length; 
    current = s[pos]; 
} 

il STRING_CHARS = String.class.getDeclaredField("value"); getta l'excpetion

10-09 10: 25: 58.240: E/AndroidRuntime (3430): causato da: java.lang.RuntimeException: java.lang.NoSuchFieldException: nessun campo valore nella classe Ljava/lang/String; (Dichiarazione di 'java.lang.String' appare in /system/framework/core-libart.jar)

non posso continuare il lavoro. Solo su Android 6.0 Marshmallow. Qualche idea?

risolto: Ora, non ho risolto il problema di inizializzazione statico ma ho cambiato il char[] s di inizializzazione:

public class ParserHelper { 

// private static final Field STRING_CHARS; 
// static { 
//  try { 
//   STRING_CHARS = String.class.getDeclaredField("value"); 
//   STRING_CHARS.setAccessible(true); 
//  } catch (Exception e) { 
//   throw new RuntimeException(e); 
//  } 
// } 

    private final char[] s; 
    private final int n; 
    private char current; 
    public int pos; 

    public ParserHelper(String str, int pos) { 
     try { 
      s = new char[str.length()]; 
      str.getChars(0, str.length(), this.s, 0); //<-- here 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
     this.pos = pos; 
     n = s.length; 
     current = s[pos]; 
    } 
+0

Non è necessario utilizzare un'istanza String per eseguire la riflessione? non un esperto su di esso. – Nanoc

+0

@Nanoc me neanche ... –

+0

Quindi prova questo e dimmi "new String (" Hello "). Class.getDeclaredField (" value ");" – Nanoc

risposta

12

Sembra campo privato s' il String chiamato value che detiene l'array di caratteri è stato rinominato in ASCII nel Marshmallow. Così si ha un RuntimeException in queste righe (presi dalla classe com.larvalabs.svgandroid.ParserHelper):

try { 
     STRING_CHARS = String.class.getDeclaredField("value"); 
     STRING_CHARS.setAccessible(true); 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 

Il svgandroid è discontinued, quindi ci sono poche possibilità che l'autore del progetto sarà risolvere questo problema e spingere il nuovo vaso per maven.You puoi creare il tuo fork della libreria svgandroid, unire this pull-request, compilare il jar e usarlo da ora in poi invece della versione mavenized.

Oppure puoi andare un po 'oltre, e spingere tu stesso la versione fissa a mvnrepository. :)

+1

Oh caro ... Se qualcuno potesse fare una correzione per questa libreria, sarebbe fantastico. Penso che molte persone lo usano, e ora tutte le loro app si stanno bloccando su marshmallow. – Deinlandel

+0

Anche se la tua risposta lo risolve, mi chiedo se avrà qualche impatto sulle prestazioni. Penso che sia stato fatto in questo modo per essere più efficiente, dato che i nuovi metodi creano una copia e attraverso la riflessione egli sta accedendo direttamente a esso. –

Problemi correlati