2015-11-19 24 views
6

Tôi đã phát triển một ứng dụng và một thư viện riêng cho Android. Thư viện gốc sử dụng ES OpenSL để xử lý âm thanh.Liên kết với thư viện được cập nhật trên Android

Trong file Android.mk của tôi, tôi có tuyên bố sau:

LOCAL_LDLIBS := -lOpenSLES 

Vì vậy, tôi đoán rằng điều này có nghĩa rằng các ứng dụng tự động sẽ liên kết trong thư viện openSLES từ hệ thống thư mục của thiết bị/lib tại thời gian khi ứng dụng được tải/thực hiện trên thiết bị?

Sự cố tôi đang gặp phải là các thư viện trên thiết bị bị lỗi và tôi có 3 thư viện được cập nhật chứa bản sửa lỗi. Nếu có thể, làm cách nào để đảm bảo rằng thư viện mẹ đẻ của tôi đang sử dụng 3 thư viện tôi có:

Libwilhelm.so 
libOpenMAXAL.so 
libOpenSLES.so 

Tôi chỉ cần thay thế

LOCAL_LDLIBS := -lOpenSLES 

với

LOCAL_SHARED_LIBRARIES := -lOpenSLES -lOpenMAXAL -lwilhelm 

Trả lời

4

Chừng nào bạn nhắm mục tiêu một thiết bị cụ thể hoặc một tập hợp các thiết bị rất hạn chế, giải pháp được đề xuất là đủ tốt. Nhưng nếu mục tiêu của bạn là ứng dụng công khai, ứng dụng này sẽ được cài đặt trên các nền tảng khác nhau, bao gồm phiên bản 'N' tương lai của Android và các ROM tùy chỉnh, bao gồm ví dụ: Samsung, bạn nên cẩn thận với các phụ thuộc hệ thống của các thư viện này.

Trong khi OpenSLES và OpenMAXAL là vô tội (chúng chỉ phụ thuộc vào liblog và libwilhelm), yêu cầu thứ hai cần được chăm sóc nhiều hơn.

Nhìn vào nó Android.mk, libwilhelm phụ thuộc vào liblog libutils libmedia libbinder libstagefright libstagefright_foundation libcutils libgui libdl libeffectslibstagefright_http_support.

Chỉ libloglibdl là "chính thức" (nghĩa là một phần của NDK). Những người khác phụ thuộc vào nền tảng và chức năng được xuất của họ có thể không tương thích với các thiết bị khác nhau chạy cùng một cấp nền tảng.

Để an toàn, tôi chỉ giới thiệu các bản sửa lỗi và tiếp tục sử dụng phiên bản hệ thống của libwilhelm khi có thể. Tôi hy vọng bạn có thể giảm bớt sự phụ thuộc hệ thống của bạn theo cách này.

+0

Vậy làm cách nào để đảm bảo rằng ứng dụng của tôi đang sử dụng phiên bản libOpenSLES.so thay vì phiên bản lỗi trong hệ thống/libs? Cụ thể, tệp Android.mk của tôi sẽ trông như thế nào? – user1884325

+0

Có, nếu bạn chỉ định nó trong LOCAL_SHARED_LIBRARIES, nó sẽ được cài đặt trên thiết bị với APK của bạn. Trên các phiên bản Android gần đây, phiên bản này sẽ được tải tự động. Trên các phiên bản cũ hơn, trình nạp có thể thích tải libs từ thư mục hệ thống, vì vậy bạn có thể sử dụng System.loadLibrary() hoặc dlopen() rõ ràng. –

+0

Khi bạn nói cũ hơn, chúng ta đang nói về tiền 4.4.2? Và bởi "nạp tự động" bạn có nghĩa là lib địa phương của tôi sẽ được tải tự động? Làm cách nào để xác minh nơi thực sự được tải từ khi ứng dụng được khởi chạy trên thiết bị? – user1884325

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