У меня есть приложение, которое использует собственные библиотеки для различных целей - 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 в качестве подключаемого модуля, но именно этого я хочу избежать.
Затем выполните следующие действия:
,
if (isArmv7())
{
System.loadLibrary("armv7/libplayer_arch.so");
}
else
{
System.loadLibrary("armv6/libplayer_arch.so");
}
System.loadLibrary("libplayer.so");