Vấn đề:tải chia sẻ libs mà phụ thuộc vào libs chia sẻ khác
Tôi đang xây dựng ứng dụng Android trong Eclipse trong đó sử dụng chia sẻ lib libgstreamer-0.10.so
(GStreamer-android libs NDK Bundle biên soạn cho nền tảng android-8). Tôi đã tạo thư mục mới libs/armeabi
trong thư mục gốc của dự án và đặt nó ở đó. Ngoài ra, tôi đã đặt tất cả các libs khác đi kèm với nó (158 trong số họ) trong cùng một thư mục. Nếu tôi đặt điều này trong mã hoạt động chính của tôi:
static{
System.loadLibrary("gstreamer-0.10");
}
Và xây dựng/cài đặt/chạy ứng dụng của tôi trên Android-8 giả lập, nó throws lỗi này:
06-15 21:54:00.835: E/AndroidRuntime(402): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1962]: 33 could not load needed library 'libglib-2.0.so' for 'libgstreamer-0.10.so' (load_library[1104]: Library 'libglib-2.0.so' not found)
Bây giờ, libglib-2.0.so
là trong cùng một thư mục là libgstreamer-0.10.so
và tại sao nó không được tải? Tôi nhận được rằng mối liên kết cố gắng để tải nó từ /system/lib
và libglib-2.0.so
chỉ là không có, nhưng tại sao nó không tải nó từ vị trí nơi libgstreamer-0.10.so
là?
Vì vậy, tôi đã đi để khám phá libs libgstreamer-0.10.so
phụ thuộc vào bằng lệnh này:
arm-linux-androideabi-readelf -d libgstreamer-0.10.so
Kết quả:
Dynamic section at offset 0x118b64 contains 29 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libglib-2.0.so]
0x00000001 (NEEDED) Shared library: [libgobject-2.0.so]
0x00000001 (NEEDED) Shared library: [libgthread-2.0.so]
0x00000001 (NEEDED) Shared library: [libgmodule-2.0.so]
0x00000001 (NEEDED) Shared library: [libdl.so]
0x00000001 (NEEDED) Shared library: [libm.so]
0x00000001 (NEEDED) Shared library: [libstdc++.so]
0x00000001 (NEEDED) Shared library: [libc.so]
0x0000000e (SONAME) Library soname: [libgstreamer-0.10.so]
0x00000010 (SYMBOLIC) 0x0
Đầu Bốn libglib-2.0.so, libgobject-2.0.so, libgthread-2.0.so, libgmodule-2.0.so
đều nằm trong cùng một thư mục libgstreamer-0.10.so
tọa lạc tại (/data/data/com.marko.gstreamer_test/lib
) trên thiết bị.
giải pháp hợp lý:
Vì vậy, tôi đã cố gắng để tải bốn libs trước khi tôi tải libgstreamer-0.10.so
và nó làm việc:
static{
System.loadLibrary("glib-2.0");
System.loadLibrary("gthread-2.0");
System.loadLibrary("gobject-2.0");
System.loadLibrary("gmodule-2.0");
System.loadLibrary("gstreamer-0.10");
}
Câu hỏi của tôi là:
Tôi bằng cách nào đó có thể yêu cầu trình liên kết tải libs cũng từ vị trí ứng dụng không? Giống như thêm đường dẫn đến một số biến môi trường hoặc một cái gì đó ... tương tự như PATH trên Linux.
Dung dịch của tôi có một số tác dụng phụ không? Ý tôi là, trình liên kết cũng sẽ làm điều này trước khi tải libgstreamer-0.10.so. Nhưng điều này sẽ làm cho bất kỳ vấn đề?
Tôi có thể cài đặt libs của mình vào thư mục /system/lib trên thiết bị chưa được hủy kích thước không?
Đó thực sự là giải pháp mà nhà phát triển Android tự giới thiệu: https://groups.google.com/forum/?fromgroups#!topic/android-ndk/F7DnfSQt8qs Với các quyết định kỹ thuật như vậy, không có gì ngạc nhiên khi Android lỗi. –
Bạn đã xác định thư viện nào để tải một cách rõ ràng? –
@dpk 'arm-linux-androideabi-readelf -d libgstreamer-0.10.so' cung cấp danh sách phụ thuộc. Một số trong số đó đã được tải (libc, vv), nhưng một số bạn cần tải một cách rõ ràng. – chrisvarnz