2015-10-09 17 views
10

Tôi đang gặp một số vấn đề nghiêm trọng với mã này, từ svg-android:Android 6.0 (Marshmallow) khởi tạo tĩnh ngoại lệ trên 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]; 
} 

các STRING_CHARS = String.class.getDeclaredField("value"); ném excpetion

10-09 10: 25: 58.240: E/AndroidRuntime (3430): Gây ra bởi: java.lang.RuntimeException: java.lang.NoSuchFieldException: Không có trường giá trị trong lớp Ljava/lang/String; (tuyên bố 'java.lang.String' xuất hiện trong /system/framework/core-libart.jar)

Tôi không thể tiếp tục công việc. Chỉ trong Android 6.0 Marshmallow. Bất kỳ ý tưởng?

SOLVED: Bây giờ, tôi không giải quyết được vấn đề khởi tạo tĩnh nhưng tôi đã thay đổi char[] s khởi:

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

Bạn không cần phải sử dụng một thể hiện String để thực hiện phản ánh? không phải là một chuyên gia về nó. – Nanoc

+0

@Nanoc tôi không ... –

+0

Sau đó, hãy thử thay vào đó và cho tôi biết "Chuỗi mới (" Xin chào "). Class.getDeclaredField (" value ");" – Nanoc

Trả lời

12

Hình như lĩnh vực riêng của String gọi value mà giữ mảng các ký tự là đổi tên thành ASCII trong Marshmallow. Vì vậy bạn có một RuntimeException trong những dòng này (lấy từ lớp com.larvalabs.svgandroid.ParserHelper):

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

Các svgandroiddiscontinued, vì vậy có rất ít cơ hội mà tác giả của dự án sẽ khắc phục vấn đề này và đẩy jar mới để maven.You có thể làm cho ngã ba thư viện svgandroid của riêng bạn, hợp nhất this pull-request, xây dựng lọ và sử dụng nó từ bây giờ thay vì phiên bản được mavenized.

Hoặc bạn có thể tiến xa hơn một chút và đẩy phiên bản cố định vào chính bản thân bạn. :)

+1

Ôi trời ơi ... Nếu ai đó sửa chữa thư viện này, nó sẽ thật tuyệt vời. Tôi nghĩ rằng nhiều người sử dụng nó, và bây giờ tất cả các ứng dụng của họ đang bị rơi trên marshmallow. – Deinlandel

+0

Mặc dù câu trả lời của bạn khắc phục được nó, tôi tự hỏi liệu nó có tác động đến hiệu suất hay không. Tôi nghĩ rằng nó đã được thực hiện theo cách đó để có hiệu quả hơn như các phương pháp mới tạo ra một bản sao và thông qua sự phản ánh, ông đang truy cập nó trực tiếp. –

Các vấn đề liên quan