Загрузка общих библиотек, которые зависят от других общих библиотек.

Проблема:

Я создаю приложение для 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");
}

Мои вопросы:

  1. Могу ли я каким-то образом указать компоновщику загружать библиотеки также из местоположения приложения? Например, добавить путь к какой-либо переменной среды или что-то в этом роде... похожее на PATH в Linux.

  2. Есть ли у моего решения побочные эффекты? Я имею в виду, что компоновщик сделал бы это также перед загрузкой libgstreamer-0.10.so. Но создаст ли это какие-то проблемы?

  3. Могу ли я установить свои библиотеки в папку /system/libна устройстве без рута?

14
задан Cipi 15 June 2012 в 22:23
поделиться