2016-02-24 16 views
10

Tôi đang cố gắng thêm thư viện được chia sẻ sẵn dựng sẵn vào dự án của tôi trong Android Studio. Tôi đang sử dụng thử nghiệm lớp học : 0.6.0-alpha5. Tuy nhiên, bất cứ khi nào tôi cố gắng thêm các thư viện chia sẻ được xây dựng sẵn để mô hình ứng dụng của tôi, tôi nhận được lỗi sau:Thư viện được chia sẻ sẵn dựng sẵn trong Android Studio với plugin Gradle thử nghiệm

Error:Cause: org.gradle.api.internal.PolymorphicDomainObjectContainerConfigureDelegate

Thư viện được thêm vào mô hình ứng dụng như thế nào nó được mô tả bởi các Google Gradle Experimental Guide:

repositories { 
    prebuilt(PrebuiltLibraries) { 
     binaries.withType(SharedLibraryBinary) { 
      sharedLibraryFile = file("/path_to_libs/${targetPlatform.getName()}/shared_lib.so") 
     } 
    } 
} 

android.sources { 
    main { 
     jniLibs { 
      dependencies { 
       library "shared_lib" 
      } 
     } 
    } 
} 

Dòng quan trọng là thư viện "shared_lib". Không có lỗi nếu tôi bỏ ghi chú dòng này.

Vì tính năng này không hoạt động, tôi cũng đã cố gắng sử dụng hướng dẫn từ ph0b.com. Họ đang sử dụng một cú pháp khác nhau để thêm các thư viện chia sẻ nguồn gốc (tôi chỉ bỏ qua các tiêu đề vì tôi không có một thư mục duy nhất bao gồm tất cả tiêu đề):

repositories { 
    libs(PrebuiltLibraries) { 
     shared_lib { 
      binaries.withType(SharedLibraryBinary) { 
       sharedLibraryFile = file("/path_to_libs/${targetPlatform.getName()}/shared_lib.so") 
      } 
     } 
    } 
} 

android.sources { 
    main { 
     jni { 
      dependencies { 
       library "shared_lib" linkage "shared" 
      } 
     } 
    } 
} 

Tuy nhiên, điều này không làm việc tốt. Android Studio không sao chép shared_lib của tôi vào tệp APK. Do đó, tôi luôn nhận được lỗi sau:

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader [...] couldn't find "shared_lib.so"

Bất cứ ai có thể cho tôi biết cách tôi có thể đưa thư viện prebuild gốc vào dự án của mình? Tôi đang sử dụng các tham số xây dựng buildToolsVersion = '22 .0.1 'compileSdkVersion = 22.

+0

bạn có thể thử với đường dẫn được mã hóa cứng tới .so thay vì '$ {targetPlatform.getName()}'? – RaGe

+0

Vâng, tôi đã thử điều đó rồi. Gradle chắc chắn có thể giải quyết đường dẫn kể từ khi tôi nhận được một lỗi nếu tôi thay đổi đường dẫn đến một tập tin không tồn tại. Tôi vẫn sẽ vui mừng nếu có một giải pháp cho vấn đề của tôi. Tuy nhiên, tôi tạm thời giải quyết vấn đề của mình bằng cách không sử dụng các thư viện dựng sẵn nữa. Tôi đã thêm tất cả các tệp tiêu đề cần thiết của mình với 'cppFlags.add (" - I $ {tệp ("./../../../ projects/test/include")} ". ToString())' và cpp các tệp có 'srcDirs + =" ./../../../ projects/test/src/"' thành jni. Nhưng nó vẫn sẽ tốt hơn để có thể sử dụng các thư viện dựng sẵn. – budderick

+0

bạn có thể chạy với '--stacktrace' và lấy thêm lỗi không? – RaGe

Trả lời

7

Điều này làm việc cho tôi (0.6.0-beta6).

repositories { 
    prebuilt(PrebuiltLibraries) { 
     YourLib { 
      binaries.withType(SharedLibraryBinary) { 
       sharedLibraryFile = file("src/main/libs/armeabi-v7a/libYourLib.so") 
      } 
     } 
    } 
} 

android.sources { 
    main { 
     jniLibs { 
      dependencies { 
       library "YourLib" 
      } 
     } 
    } 
} 

Có vẻ như họ vừa quên đề cập đến phần "YourLib {}" xung quanh "binaries.withType".

+0

Cảm ơn! điều này phù hợp với tôi khi thử nghiệm từng bước: 0.6.0 – Xuelong

+0

Tôi sẽ đánh dấu đây là giải pháp cho vấn đề chung. Cú pháp của @Zhur là cú pháp chính xác. Tuy nhiên, tôi nghĩ rằng UnsatisfiedLinkError là một lỗi phức tạp hơn mà hầu như không có gì để làm với tệp Gradle. – budderick

+0

@budderick Nó có: do tệp Gradle không chính xác nên thư viện được chia sẻ không tham gia APK. Vì vậy, tại thời gian chạy, mối liên kết không thể tìm thấy thư viện đó và ném ngoại lệ. – zhur

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