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

Problem:

Я создаю Android-приложение в Eclipse, которое использует общую библиотекуlibgstreamer-0.10.so (GStreamer-android NDK Bundle libs compiled for android-8 platform), Я сделал новую папку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.so, libgthread-2.0.so, libgmodule-2.0.so все находятся в одной папкеlibgstreamer-0.10.so находится в (/data/data/com.marko.gstreamer_test/lib) на устройстве.

Logical solution:

Итак, я попытался загрузить эти четыре библиотеки перед загрузкой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");
}

My questions are:

Can I somehow tell the linker to load libs also from the app location? Like add path to some environment variable or something... similar to PATH on Linux.

Does my solution have some bad side-effects? I mean, linker would do this also before it loads the libgstreamer-0.10.so. But will this make any problems?

Can I install my libs to /system/lib folder on unrooted device?

Ответы на вопрос(2)

Ваш ответ на вопрос