2015-12-24 16 views
5

Sto cercando di utilizzare Byte Buddy libreria in Android ma ottengo un errore:errore utilizzando Byte amici su Android

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

ho ancora codificato nulla, solo:

ByteBuddy test = new ByteBuddy(); 

nella mia app .java

ho importato:

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

ma non ha funzionato, per ho provato con:

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

ma ho ancora ottenere lo stesso errore.

EDIT

ho messo questa linea prima di inizializzare ByteBuddy:

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

Ma ora ottengo questo un altro errore:

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

per questo codice:

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(); 
+1

Su Android, provare ad aggiungere la versione del file di classe in modo esplicito: new ByteBuddy (ClassFileVersion.JAVA_6), la dipendenza Android contiene un ClassLoadingStrategy specifico per Android. –

+0

Ho modificato la strategia di caricamento della classe su Android e ho specificato ClassFileVersion, ma ottengo lo stesso errore. –

+1

Non stai utilizzando la strategia di caricamento della classe Android. Le strategie di default non funzionano lì. Istanziare uno usando "nuovo". –

risposta

3

L'errore è dovuto al fatto java.version rendimenti a Android (Proprietà di sistema, vedere la sezione here - Comparison of Java and Android API)

Inoltre, se si osserva ByteBuddy ClassFileVersion

forCurrentJavaVersion(): questo metodo verifica la presenza di versionString che dovrebbe restituire qualsiasi versione Java/JDK valida altro

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

& dal java.version sta tornando , è gettando IllegalStateException.

tenta di accedere questo valore:

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

quindi soluzione di questo problema è quello di aggiungere

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

prima di chiamare

ByteBuddy test = new ByteBuddy(); 

dove JAVA_VERSION_PROPERTY è dichiarato come:

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

anche dipendenza da utilizzare è:

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

Altrimenti se si utilizza in studio, è possibile aggiungere

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

per la vostra applicazione build.gradle.

Spero che questo aiuti a risolvere il tuo problema.