我对此代码存在严重问题,来自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];
}
答案 0 :(得分:15)
看起来名为String
的{{1}}私有字段保存了字符数组,并在Marshmallow中重命名为value
。因此,这些行中有ASCII
(取自RuntimeException
类):
com.larvalabs.svgandroid.ParserHelper
try {
STRING_CHARS = String.class.getDeclaredField("value");
STRING_CHARS.setAccessible(true);
} catch (Exception e) {
throw new RuntimeException(e);
}
是discontinued,因此该项目的作者很可能无法修复此问题并将新jar推送到maven。您可以创建自己的svgandroid库,merge {{ 3}},构建jar并从现在开始使用它而不是mavenized版本。
或者您可以更进一步,并将修复版本推送到mvnrepository。 :)