svg-android库中getDeclaredField()的Android 6.0(Marshmallow)静态初始化异常

时间:2015-10-09 10:26:37

标签: java android-6.0-marshmallow static-initialization

我对此代码存在严重问题,来自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 个答案:

答案 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。 :)