Xét rằng ứng dụng của bạn hoạt động một cách chính xác trên hầu hết các thiết bị và chỉ thỉnh thoảng cung cấp cho bạn các lỗi, nó là an toàn để giả định rằng thư viện được đóng gói chính xác trong APK và kích thước/bộ nhớ của nó cũng được chấp nhận.
Vì vậy, tôi sẽ tiếp tục ý thích và đề xuất rằng vấn đề là với kiến trúc xây dựng/biên dịch của thư viện. Hầu hết các thiết bị Android mới hơn đều sử dụng bộ vi xử lý ARM7. Rất có khả năng là thư viện của bạn được biên dịch dựa trên kiến trúc ARM7. Một số thiết bị cũ hơn, đặc biệt là các thiết bị chạy Android 2.3, sử dụng bộ vi xử lý ARM6 (tôi có một thiết bị như vậy mà tôi sử dụng để thử nghiệm - LG GT540 chạy Android 2.3.3), không tương thích về phía trước với kiến trúc ARM7. Tôi đã thấy một sự cố có lỗi tương tự như lỗi bạn chỉ định (load_segments: 68 không thể phân đoạn bản đồ từ mylib.so) khi tôi cố chạy một ứng dụng được thiết kế cho ARM7 trên điện thoại ARM6 cũ của tôi.
Có ba cách để đi xung quanh vấn đề này:
Biên dịch thư viện chống lại cả kiến trúc và bao gồm hai tập tin riêng biệt .so vào apk. Sau đó, tại thời gian chạy xác định loại bộ vi xử lý và tải đúng bộ xử lý. Thành thật mà nói, tôi không biết nếu điều này thậm chí có thể.
Tạo hai tệp apk riêng biệt - một cho ARM6 và một cho ARM7 - sau đó sử dụng bộ lọc trong tệp kê khai để chỉ định kiến trúc tương ứng. Bạn có thể tải cả hai lên Google Play cho cùng một ứng dụng - và các bộ lọc trong tệp kê khai sẽ kiểm soát ứng dụng nào được tải xuống thiết bị nào.
Chỉ hỗ trợ kiến trúc ARM7 bằng cách chỉ định các yêu cầu thiết bị trong tệp kê khai của bạn. Bạn sẽ mất một số đối tượng khách hàng, nhưng sẽ có ít công việc hơn cho chính bạn duy trì hai phiên bản của ứng dụng.
EDIT: Theo tài liệu NDK, nó có thể sản xuất nhiều thư viện cho các kiến trúc khác nhau trong một đi.Bạn có thể kiểm soát đặc biệt mà CPU bạn muốn nhắm mục tiêu bằng cách thêm dòng sau vào file Application.mk
:
APP_ABI := arch1 arch2 arch3 ...
ví dụ,
APP_ABI := armeabi armeabi-v7a mips
Sau đó, quá trình xây dựng sẽ tạo ra các phiên bản khác nhau của thư viện bản xứ. Các phiên bản này sẽ cần phải được đặt trong gói ứng dụng cuối cùng trong thư mục
lib/<abi>/lib<name>.so
là tên của kiến trúc. Sau đó, bạn sẽ tải thư viện với
System.loadLibrary("<name>");
Hoặc bạn có thể tạo các tệp APK riêng cho từng kiến trúc, sau đó sử dụng chức năng nhiều apk trên google play.
Bạn có thể tìm thấy tất cả thông tin về nhắm mục tiêu kiến trúc trong tệp CPU-ARCH-ABIS.html
tệp trong thư mục con docs
của NDK.
Nguồn
2013-05-13 10:20:40
Tôi có thư viện gốc lớn, lớn đến mức nào? Có lẽ nó không đáp ứng một số yêu cầu bộ nhớ và hệ thống không thể tải. – Blackbelt
~ 7MB (phiên bản gỡ lỗi) – Shri
Đó chắc chắn không phải là vấn đề về bộ nhớ. Trong thiết bị nào bạn đã hết hạn vấn đề này? – Blackbelt