Подтвердить что ты не робот

Исключение статической инициализации Android 6.0 (Marshmallow) на getDeclaredField()

У меня возникла серьезная проблема с этим кодом: svg-android:

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];
}

STRING_CHARS = String.class.getDeclaredField("value"); выбрасывает экскремент

10-09 10: 25: 58.240: E/AndroidRuntime (3430): вызвано: java.lang.RuntimeException: java.lang.NoSuchFieldException: Нет поля значение в классе Ljava/lang/String; (объявление "java.lang.String" появляется в /system/framework/core -libart.jar)

Я не могу продолжить работу. Только в Android 6.0 Marshmallow. Любая идея?

РЕШИТЬ: Теперь я не решил проблему статической инициализации, но я изменил инициализацию char[] s:

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];
    }
4b9b3361

Ответ 1

Похоже, что частное поле String, называемое value, которое содержит массив символов, было переименовано в ASCII в Marshmallow. Таким образом, у вас есть RuntimeException в этих строках (взято из класса com.larvalabs.svgandroid.ParserHelper):

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

svgandroid прекращено, поэтому вероятность того, что автор проекта исправит эту проблему, не будет иметь шансов, и нажимать новую банку на maven. Вы можете сделать свой собственный fork of svgandroid library, merge этот pull-request, создайте банку и используйте ее сейчас, а не mavenized версию.

Или вы можете пойти немного дальше и перенести исправленную версию в mvnrepository самостоятельно.:)