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