2015-12-24 4 views
5

Я пытаюсь использовать Byte Buddy библиотеку в Android, но я получаю сообщение об ошибке:Ошибка при помощи Byte Бадди на Android

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

Я не закодированы еще ничего, просто:

ByteBuddy test = new ByteBuddy(); 

в моем приложении .java

я импортировал:

<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> 

, но я все еще получаю ту же ошибку.

EDIT

Я поставил эту строку перед инициализировать ByteBuddy:

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

Но теперь я получаю эту другую ошибку:

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

для этого кода:

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

На Android попробуйте добавить версию файла класса явно: новый ByteBuddy (ClassFileVersion.JAVA_6), зависимость от Android содержит специфичную для Android ClassLoadingStrategy. –

+0

Я изменил стратегию загрузки класса на Android-версию и задал ClassFileVersion, но все равно получаю ту же ошибку. –

+1

Вы не используете стратегию загрузки классов Android. Стратегии по умолчанию там не работают. Создайте экземпляр, используя «новое». –

ответ

3

Ошибка в том, что java.version возвращается в Android (смотрите раздел Свойства системы here - Comparison of Java and Android API)

Кроме того, если вы наблюдаете ByteBuddy ClassFileVersion

forCurrentJavaVersion(): Этот метод проверяет наличие versionString, который должен возвращать любую действительную версию Java/JDK, иначе он

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> 

Иначе, если вы используете студии, вы можете добавить

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

вашему приложение build.gradle.

Надеюсь, это поможет решить вашу проблему.

 Смежные вопросы

  • Нет связанных вопросов^_^