2015-12-24 16 views
5

Tôi đang cố gắng sử dụng Byte Buddy thư viện trong Android nhưng tôi nhận được một lỗi:Lỗi sử dụng Byte Buddy trên Android

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

Tôi đã được mã hóa gì cả, chỉ cần:

ByteBuddy test = new ByteBuddy(); 

trong App của tôi java

tôi đã nhập khẩu:

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

nhưng nó đã không làm việc, để tôi thử với:

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

nhưng tôi vẫn nhận được cùng một lỗi.

EDIT

Tôi đã đưa dòng này trước khi khởi ByteBuddy:

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

Nhưng bây giờ tôi có được điều này lỗi khác:

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

cho mã này:

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

Trên Android, hãy thử thêm phiên bản tệp lớp một cách rõ ràng: mới ByteBuddy (ClassFileVersion.JAVA_6), phụ thuộc Android chứa một ClassLoadingStrategy cụ thể của Android. –

+0

Tôi đã thay đổi chiến lược tải lớp cho Android và chỉ định ClassFileVersion nhưng tôi vẫn gặp lỗi tương tự. –

+1

Bạn hiện không sử dụng chiến lược tải lớp Android. Các chiến lược Mặc định không hoạt động ở đó. Khởi tạo một bằng cách sử dụng "mới". –

Trả lời

3

Lỗi này là vì java.version lợi nhuận trong Android (Xem hệ thống phần Thuộc tính here - Comparison of Java and Android API)

Ngoài ra, nếu bạn quan sát ByteBuddy ClassFileVersion

forCurrentJavaVersion(): Phương pháp này kiểm tra cho versionString nên trả về phiên bản Java/JDK hợp lệ khác

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

& từ java.version đang trở lại , nó ném IllegalStateException.

Cố gắng đăng nhập giá trị này:

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

do đó workaround cho vấn đề này là thêm

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

trước khi gọi

ByteBuddy test = new ByteBuddy(); 

nơi JAVA_VERSION_PROPERTY được khai báo là:

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

Cũng phụ thuộc để sử dụng là:

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

khác nếu bạn đang sử dụng studio, bạn có thể thêm

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

để bạn ứng dụng build.gradle.

Hy vọng điều này sẽ giúp giải quyết vấn đề của bạn.

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