2015-10-09 6 views
10

मैं, इस कोड के साथ कुछ गंभीर समस्या आ रही है svg-android से:एंड्रॉयड 6.0 (Marshmallow) 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]; 
} 

STRING_CHARS = String.class.getDeclaredField("value"); excpetion फेंकता

10-09 10: 25: 58.240: ई/एंड्रॉइड रनटाइम (3430): के कारण: java.lang.RuntimeException: java.lang.NoSuchFieldException: कोई फ़ील्ड कक्षा Ljava/lang/String में मूल्य; ('Java.lang.String' की घोषणा /system/framework/core-libart.jar में प्रकट होता है)

मैं काम जारी नहीं रख सकते। केवल एंड्रॉइड 6.0 मार्शमलो में। कोई उपाय?

हल: अब, मैं स्थिर प्रारंभ समस्या हल हो जाती नहीं था, लेकिन मैं 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

क्या आपको प्रतिबिंब करने के लिए स्ट्रिंग उदाहरण का उपयोग करने की आवश्यकता नहीं है? इस पर एक विशेषज्ञ नहीं है। – Nanoc

+0

@ नैनोक मुझे न तो ... –

+0

फिर इसके बजाय इसे आजमाएं और मुझे "नया स्ट्रिंग (" हैलो ") बताएं। Class.getDeclaredField (" value ");" – Nanoc

उत्तर

12

String के निजी क्षेत्र value कहा जाता है जो वर्ण की सरणी था रखती है ऐसा लगता है मार्शमलो में ASCII का नाम बदल दिया गया।

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

svgandroiddiscontinued है, इसलिए वहाँ संभावना बहुत कम है कि परियोजना के लेखक इस समस्या को हल और maven.You करने के लिए नए जार धक्का जाएगा: इस प्रकार आप इन पंक्तियों (com.larvalabs.svgandroid.ParserHelper वर्ग से लिया) में एक RuntimeException है svgandroid लाइब्रेरी का अपना कांटा बना सकते हैं, this pull-request मर्ज करें, जार बनाएं और इसे अब से मैवेनाइज्ड संस्करण के बजाय उपयोग करें।

या आप थोड़ा आगे जा सकते हैं, और निश्चित संस्करण को स्वयं को mvnrepository में धक्का दे सकते हैं। :)

+1

ओह प्रिय ... अगर कोई इस पुस्तकालय के लिए एक फिक्स करेगा, तो यह बहुत ही अच्छा होगा। मुझे लगता है कि बहुत से लोग इसका इस्तेमाल करते हैं, और अब उनके सभी ऐप्स मार्शमलो पर दुर्घटनाग्रस्त हो रहे हैं। – Deinlandel

+0

हालांकि आपका उत्तर इसे ठीक करता है, मुझे आश्चर्य है कि इसका प्रदर्शन पर कोई असर होगा या नहीं। मुझे लगता है कि यह नए तरीके के रूप में अधिक प्रतिलिपि बनाने के लिए किया गया था क्योंकि प्रतिबिंब के माध्यम से और प्रतिबिंब के माध्यम से वह सीधे इसे एक्सेस कर रहा है। –

संबंधित मुद्दे