Проблема:
Я создаю приложение для Android в Eclipse, которое использует общую библиотеку libgstreamer-0.10.so
(GStreamer-android NDK Bundle скомпилированные библиотеки для платформы android-8). Я создал новую папку libs/armeabi
в корневой папке проекта и поместил ее туда. Кроме того, я поместил все остальные библиотеки, которые поставлялись с ним (158 из них), в ту же папку. Если я помещу это в свой основной код действия:
static{
System.loadLibrary("gstreamer-0.10");
}
И соберу/установлю/запущу свое приложение на эмуляторе Android-8, он выдаст эту ошибку:
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)
Теперь libglib-2.0.so
находится в та же папка, что и libgstreamer-0.10.so
, и почему она не загружается? Я понимаю, что компоновщик пытается загрузить его из /system/lib
и libglib-2.0.so
просто там нет, но почему он не загружает его из места, где libgstreamer-0.10.so
есть?
Итак, я отправился выяснить, от каких библиотек libgstreamer-0.10.so
зависит, с помощью этой команды:
arm-linux-androideabi-readelf -d libgstreamer-0.10.so
Результаты:
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
Первые четыре libglib-2.0.so, libgobject-2.0. Итак, libgthread-2.0.so, libgmodule-2.0.so
находятся в одной папке libgstreamer-0.10.so
находится в ( /data/data/com.marko. gstreamer_test/lib
) на устройстве.
Логическое решение:
Итак, я попытался загрузить эти четыре библиотеки перед загрузкой libgstreamer-0.10.Итак,
и это сработало:
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");
}
Мои вопросы:
Могу ли я каким-то образом указать компоновщику загружать библиотеки также из местоположения приложения? Например, добавить путь к какой-либо переменной среды или что-то в этом роде... похожее на PATH в Linux.
Есть ли у моего решения побочные эффекты? Я имею в виду, что компоновщик сделал бы это также перед загрузкой libgstreamer-0.10.so. Но создаст ли это какие-то проблемы?
Могу ли я установить свои библиотеки в папку /system/libна устройстве без рута?