Собственные библиотеки .so.XY не могут быть связаны во время выполнения

Я создал FFmpeg для Android и хочу использовать его в таком приложении:

System.loadLibrary("avutil");
System.loadLibrary("swscale");
System.loadLibrary("avcodec");
System.loadLibrary("avformat");

Результатом сборки являются файлы lib*.so, lib*.so.MAJOR и lib*.so.MAJOR.MINOR.OTHER. Внутри общих объектов есть ссылки типа lib*.so.MAJOR, например, libswscale.so.2 требует libavutil.so.52.

Теперь, если я положу файлы *.so в папку libs проекта (точнее libs/armeabi-v7a), я, конечно, получу

01-25 12:06:40.270: E/AndroidRuntime(2905): java.lang.UnsatisfiedLinkError: невозможно загрузить библиотеку: link_image[1936]: 107 не удалось загрузить необходимую библиотеку libavutil.so.52 для libswscale.so (load_library[1091]: библиотека 'libavutil.so.52' не найдена)

Однако, если вместо этого я поместил файлы *.so.MAJOR в папку libs, чтобы устранить исключение связывания, я получаю ту же ошибку при запуске приложения из Eclipse. И я заметил, что файлы даже не экспортируются, если я создаю APK! Итак, как мне указать Eclipse упаковать файлы *.so.MAJOR как библиотеки? Или, альтернативно, как мне скомпилировать общие объекты таким образом, чтобы они ссылались друг на друга по *.so вместо *.so.MAJOR?

РЕДАКТИРОВАТЬ: кажется, нет способа упаковать файлы *.so.XYZ автоматически.


person AndiDog    schedule 25.01.2013    source источник


Ответы (2)


Не нашел решения взять .so.MAJOR файлы, как хотел. Мне кажется, что система сборки Android автоматически копирует только *.so файлов и не допускает других расширений файлов.
Поэтому я переписал make-файлы FFmpeg, чтобы общие объекты ссылались друг на друга по libXXX.so.

В library.mak я заменил $(SHFLAGS) в следующем рецепте

$(SUBDIR)$(SLIBNAME_WITH_MAJOR): $(OBJS) $(SUBDIR)lib$(NAME).ver
    $(SLIB_CREATE_DEF_CMD)
    $$(LD) $(SHFLAGS) $(LDFLAGS) $$(LD_O) $$(filter %.o,$$^) $(FFEXTRALIBS)
    $(SLIB_EXTRA_CMD)

чтобы третья строка выглядела как

$(subst $$(@F),$(SLIBNAME),$(SHFLAGS))

Для тех, кто не понимает замену (например, я раньше), проверьте этот ответ, напрямую связанный с ним.

person AndiDog    schedule 26.01.2013

На самом деле, вам не нужно этого делать. Что вам нужно сделать, это отредактировать файл конфигурации. И узнайте это:

SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'

Изменил их, чтобы они были:

SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
person Sunderr    schedule 10.01.2014