Исключение статической инициализации 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];
}
Ответы
Ответ 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 самостоятельно.:)