2015-12-24 4 views
5
पर बाइट बडी का उपयोग कर त्रुटि

मैं Android में Byte Buddy लाइब्रेरी का उपयोग करने की कोशिश कर रहा हूँ, लेकिन मैं कोई त्रुटि मिलती है: मेरे App मेंएंड्रॉयड

ByteBuddy test = new ByteBuddy(); 

:

java.lang.IllegalStateException: This JVM's version string does not seem to be valid: 0

मैंने अभी तक कुछ भी नहीं कोडित है, बस जावा

मैं आयात किया है:

<dependency> 
    <groupId>net.bytebuddy</groupId> 
    <artifactId>byte-buddy</artifactId> 
    <version>0.7.7</version> 
</dependency> 

लेकिन यह काम नहीं किया, के लिए मैं के साथ की कोशिश की:

<dependency> 
    <groupId>net.bytebuddy</groupId> 
    <artifactId>byte-buddy-android</artifactId> 
    <version>0.7.7</version> 
</dependency> 

लेकिन मैं अभी भी एक ही त्रुटि मिलती है।

संपादित

मैं इस लाइन डाल दिया है पहले ByteBuddy प्रारंभ:

System.setProperty("java.version", "1.7.0_51"); 

लेकिन अब मैं इस एक और त्रुटि मिलती है:

Class<?> dynamicType = new ByteBuddy(ClassFileVersion.JAVA_V6) 
      .subclass(Object.class) 
      .method(ElementMatchers.named("toString")) 
      .intercept(FixedValue.value("Hello World!")) 
      .make() 
      .load(getClass().getClassLoader(), AndroidClassLoadingStrategy.Default.WRAPPER) 
      .getLoaded(); 
: इस कोड के लिए

Caused by: java.lang.UnsupportedOperationException: can't load this type of class file.

+1

एंड्रॉइड पर, कक्षा फ़ाइल संस्करण को स्पष्ट रूप से जोड़ने का प्रयास करें: नया बाइटबड्डी (क्लासफाइलवर्सन.जेएवीए_6), एंड्रॉइड निर्भरता में एक एंड्रॉइड विशिष्ट क्लासलोडिंगस्ट्रेटी है। –

+0

मैंने कक्षा लोडिंग रणनीति को एंड्रॉइड वन में बदल दिया है और क्लासफाइलवर्सन निर्दिष्ट किया है लेकिन मुझे अभी भी वही त्रुटि मिलती है। –

+1

आप एंड्रॉइड क्लास लोडिंग रणनीति का उपयोग नहीं कर रहे हैं। डिफ़ॉल्ट रणनीतियां वहां काम नहीं करती हैं। "नया" का उपयोग कर एक को तत्काल करें। –

उत्तर

3

त्रुटि है क्योंकि java.version रिटर्न एंड्रॉयड (अनुभाग सिस्टम देखें गुण here - Comparison of Java and Android API)

इसके अलावा, अगर आप का पालन ByteBuddy ClassFileVersion

forCurrentJavaVersion() में: के लिए इस विधि के चेक संस्करणस्ट्रिंग जो किसी भी वैध जावा/जेडीके संस्करण को वापस करना चाहिए अन्यथा यह

throws IllegalStateException("This JVM's version string does not seem to be valid: " + versionString); 

& के बाद से java.version लौटने , यह IllegalStateException फेंक रहा है।

कोशिश यह मान लॉग इन करने की:

String versionString = System.getProperty(JAVA_VERSION_PROPERTY); 
Log.d(TAG, versionString);//retruns 0 here 

इसलिए इस समस्या के लिए समाधान नहीं है

System.setProperty(JAVA_VERSION_PROPERTY, "1.7.0_79");//add your jdk version here 

ByteBuddy test = new ByteBuddy(); 

जहां JAVA_VERSION_PROPERTY के रूप में घोषित किया जाता है कॉल करने से पहले जोड़ने के लिए:

private static final String JAVA_VERSION_PROPERTY = "java.version"; 

इसके अलावा निर्भरता उपयोग करने के लिए है:

<dependency> 
<groupId>net.bytebuddy</groupId> 
<artifactId>byte-buddy</artifactId> 
<version>0.7.7</version> 
</dependency> 

वरना अगर आप स्टूडियो का उपयोग कर रहे हैं, तो आप अपने ऐप build.gradle को

compile 'net.bytebuddy:byte-buddy:0.7.7' 

जोड़ सकते हैं।

आशा है कि यह आपकी समस्या को हल करने में मदद करेगा।