Как заставить скрипт сборки Android размещать собственные библиотеки в правильных папках библиотеки в соответствии с его версией eabi?

1

У меня есть приложение, которое использует собственные библиотеки для различных целей - ARMv6, ARMv6 + vfp, ARM7 + vfp, ARM7 + Neon, ARM7 + Tegra, а также некоторые универсальные библиотеки. Моя цель состоит в том, чтобы упаковать все библиотеки в один.apk файл, так что мне не нужно распространять отдельные сборки - мне не очень нравится общий размер.apk.

Вот мой сценарий Android.mk - просто пример, но с достаточной информацией:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
TARGET_ARCH_ABI := armeabi
LOCAL_MODULE := prebuilt_arm_v6vfp
LOCAL_SRC_FILES := ../bin/libplayer_v6vfp.so
LOCAL_EXPORT_LDLIBS := ../libplayer_v6vfp.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
TARGET_ARCH_ABI := armeabi-v7a
LOCAL_MODULE := prebuilt_arm_v7n
LOCAL_SRC_FILES := ../bin/libplayer_v7n.so
LOCAL_EXPORT_LDLIBS := ../libplayer_v7n.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := player

LOCAL_SRC_FILES := some_cpp_sources...

LOCAL_LDFLAGS := -L$(LOCAL_PATH)/../bin
LOCAL_LDLIBS := -llog -lz -lm -lplayer_v7n -lplayer_v6vfp
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

include $(BUILD_SHARED_LIBRARY)

Теперь у меня есть следующая проблема: она создает папку libs с armeabi и armeabi-v7a - это нормально. Но содержание обоих вложенных папок одинаково, оба содержат libplayer_v7n.so и libplayer_v6vfp.so.

Как я могу заверить, что каждая вложенная папка содержит только правильную версию родной библиотеки в соответствии с ее версией eabi?

ИЗМЕНИТЬ 1:

Как вы можете видеть, я связываю libplayer.so как с общими библиотеками, так и с совместимыми интерфейсами. Я хотел бы выбрать правильную библиотеку динамически при загрузке в моей оболочке Java после обнаружения типа ЦП. Но, похоже, это невозможно. Любая идея, как выбрать правильную библиотеку динамически? Должно быть решение такого обычного случая.

EDIT 2:

Кажется, я могу связать libplayer.so только с одной библиотекой и должен выбрать ее правильную версию во время выполнения. Но теперь проблема заключается в том, как хранить шесть родных библиотек различных версий, но с тем же именем в папке lib. Подпапки кажутся очевидным решением, но я не уверен, что это возможно. Другим решением было бы развернуть правильную библиотеку через отдельный.apk в качестве подключаемого модуля, но именно этого я хочу избежать.

  • 0
    Но вы связываете свой libplayer.so с обеими общими библиотеками, поэтому они должны быть в одной папке. Правильно?
  • 0
    Да, я связываю свой libplayer.so с обеими общими библиотеками, они имеют совместимые интерфейсы. Я хочу выбрать правильную библиотеку динамически при загрузке в моей оболочке Java после определения типа процессора; Я надеюсь, что это возможно ...
Показать ещё 2 комментария
Теги:
android-ndk

1 ответ

2
Лучший ответ

Затем выполните следующие действия:

  1. именные библиотеки с одинаковым именем (например: libplayer_arch.so) и помещают их в разные каталоги.
  2. ссылка libplayer.so на libplayer_arch.so
  3. напишите свой Java-код следующим образом:

,

if (isArmv7())
{
    System.loadLibrary("armv7/libplayer_arch.so");
}
else
{
    System.loadLibrary("armv6/libplayer_arch.so");
}
System.loadLibrary("libplayer.so");
  • 0
    Спасибо за Ваш ответ. Ты прав; Я понял, что не так, чуть позже, после вашего ответа - см. РЕДАКТИРОВАНИЕ 2. Можно ли создавать подпапки в папке libs с помощью скрипта Android.mk (кроме armeabi и armeabi –v7a)? Я так не думаю.
  • 0
    Я не уверен, как это сделать из Android.mk сделать скрипт. Если вы хотите сохранить другое имя, вы можете загружать библиотеки динамически во время выполнения, используя функции dlopen / dlsym / dlclose.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню