2015-06-11 20 views
43

Tôi sử dụng thư viện gốc trong ứng dụng của mình chỉ được biên dịch cho armeabi, armeabi-v7a và x86.Cách sử dụng thư viện gốc 32 bit trên thiết bị Android 64 bit

Khi thư viện này được nạp vào một thiết bị 64-bit như Samsung S6, các ứng dụng bị treo với một UnsatisfiedLinkError

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.myapp-2/base.apk"],nativeLibraryDirectories=[/data/app/com.myapp-2/lib/arm64, /vendor/lib64, /system/lib64]]] couldn't find "libfoo.so" 
    at java.lang.Runtime.loadLibrary(Runtime.java:366) 
    at java.lang.System.loadLibrary(System.java:989) 

Thư viện là nguồn đóng không may. Có cách nào để sửa lỗi này mà không biên dịch lại thư viện với các mục tiêu 64 bit không?

+0

Bạn đã nhìn https: // stackoverflow. com/q/27712921/603270 và https://stackoverflow.com/a/29329413/603270? – shkschneider

+0

Tôi đã làm. Một ứng dụng được áp dụng cho AOSP, một ứng dụng khác cho tải lớp động. Trường hợp của tôi thực sự đơn giản hơn nhiều. Nhưng tôi mới phát hiện ra rằng một thư viện gốc khác mà tôi đưa vào thực sự cung cấp các tệp .so 64 bit, do đó có một thư mục arm64-86 trong thư mục/lib của tôi trong gói ứng dụng cuối cùng. Có lẽ đây là lý do tại sao hệ thống giả định rằng tôi cung cấp các tệp .so 64 bit trong mọi trường hợp. Tôi sẽ cố gắng biên dịch lại librariy này chỉ với hỗ trợ 32 bit và xem nó có hoạt động hay không. –

+0

Suy nghĩ tốt. Hãy cho chúng tôi biết (trả lời câu hỏi của bạn nếu cần). – shkschneider

Trả lời

109

Khi bạn cài đặt APK trên Android, hệ thống sẽ tìm thư mục gốc của thư viện (armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, mips64, mips) bên trong thư mục lib của APK, theo thứ tự được xác định bởi Build.SUPPORTED_ABIS.

Nếu ứng dụng của bạn tình cờ có một thư mục arm64-v8a thiếu thư viện, các thư mục bị thiếu sẽ không được cài đặt từ thư mục khác, các thư mục libs không được trộn lẫn. Điều đó có nghĩa là bạn phải cung cấp bộ thư viện đầy đủ cho mỗi kiến ​​trúc.

Vì vậy, để giải quyết vấn đề của bạn, bạn có thể xóa libs 64-bit của bạn từ xây dựng của bạn, hoặc thiết lập abiFilters để gói chỉ kiến ​​trúc 32-bit:

android { 
    .... 
    defaultConfig { 
     .... 
     ndk { 
      abiFilters "armeabi", "armeabi-v7a", "x86", "mips" 
     } 
    } 
} 
+1

Có vẻ tốt, các thư mục 64 bit đã biến mất với đoạn mã này. Tôi sẽ đánh dấu câu trả lời là được chấp nhận khi tôi có thể tìm thấy điện thoại 64 bit để tái tạo –

+0

http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits#TOC-ABIs- Tách –

+0

Lỗi khi tích hợp NDK không được chấp nhận trong plugin hiện tại. Cân nhắc thử plugin thử nghiệm mới. –

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