2015-11-30 26 views
8

Tôi đang cố gắng thêm một số lib (.jar & .so) vào dự án multidex của tôi trong studio android.Android multidex, UnsatisfiedLinkError - không thể tìm thấy .so file

khi tôi chỉ thêm một vài lọ vào dự án, mọi thứ đều hoạt động tốt. trong trường hợp tôi thêm ngày càng nhiều lọ (libs khác) tôi nhận được lỗi này:

java.lang.UnsatisfiedLinkError: 
    dalvik.system.PathClassLoader[DexPathList[[zip file 
    "/data/app/com.test.digital.ocrtest-2/base.apk"],nativeLibraryDirectories=[/data/app/com.test.digital.ocrtest-2/lib/arm, 
    /data/app/com.test.digital.ocrtest-2/base.apk!/lib/armeabi-v7a, 
    /vendor/lib, /system/lib]]] couldn't find 
    "libScanovatePassportAndIDLSDK_CPP.so" 

bất kỳ ý tưởng làm thế nào tôi có thể nói với trình biên dịch để tạo jar và như vậy trong cùng một dex?

+0

Không, .so không đi vào dex. Nhưng hãy kiểm tra xem .so đã được đóng gói vào APK của bạn chưa. Bạn có thể sử dụng 'giải nén -l' để liệt kê nội dung của tệp APK. –

+0

có, nó đã được đóng gói trong APK của tôi. –

+0

Tổng kích thước của APK của bạn khi nó ngừng hoạt động là bao nhiêu? Thiết bị nào đây? –

Trả lời

4

Nếu một số lọ phụ mang libries bản địa cho armeabi-v7a, trong khi bạn libScanovatePassportAndIDLSDK_CPP.so chỉ xây dựng cho armeabi, trình cài đặt sẽ trích xuất một bộ sai của thư viện. Bản sửa lỗi không được thêm nhiều bản sao của .so, nhưng thay vì loại bỏ các ABI khác. Ở chế độ gradle, bạn có thể sử dụng splits.

+2

Cảm ơn vì điều này! Tôi đã cạn kiệt tất cả các câu hỏi UnsatisfiedLinkError cơ bản; cuối cùng đã tìm thấy điều này. –

1

Có một giải pháp thanh lịch cho việc này. Khi tệp APK của bạn không chứa tất cả các lib gốc trong phiên bản 64 bit cho một ABI nhất định, bạn chỉ cần đảm bảo rằng tệp APK của bạn không chứa bất kỳ libs 64bit nào. Dưới đây là hướng dẫn về cách cấu hình dự án của bạn để sửa lỗi này: https://corbt.com/posts/2015/09/18/mixing-32-and-64bit-dependencies-in-android.html

nền Khi ứng dụng của bạn được cài đặt trên thiết bị 64bit ABI, quản lý gói quét các tập tin APK trên cài đặt và tìm kiếm 64bit thư viện bản xứ. Nếu nó tìm thấy thư mục 64bit gốc thích hợp (bạn có thể kiểm tra thư mục/libs trong tệp APK của mình nếu bạn mở nó bằng bất kỳ ứng dụng zip nào), nó giả định rằng tất cả các thư viện gốc đều có sẵn trong các phiên bản 64 bit. Nếu một hoặc nhiều thư viện gốc không có sẵn trong phiên bản 64bit, trình quản lý gói sẽ không tải phiên bản 32 bit của chúng. Do đó, khi ứng dụng tìm cách chạy mã dựa trên các librairies gốc này, bạn sẽ nhận được thông báo UnsatisfiedLinkError này. Điều này có nghĩa là phiên bản 32bit của thư viện của bạn

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