Android NDK: сборка толстого бинарного файла с помощью BUILD_EXECUTABLE и armeabi-v7a-hard
Коротко: Как система Android NDK преобразует "APP_ABI:= armeabi-v7a-hard" в конечные файлы.so, расположенные в "libs/armeabi-v7a"? Как правильно сделать то же самое в Android.mk? В настоящее время, чтобы создать автономный исполняемый файл и поместить его в папки, соответствующие различным ABI, я использую это, что выглядит ужасно из-за жестко закодированного "ifeq ($(TARGET_ARCH_ABI),armeabi-v7a-hard)":
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
SAVED_NDK_APP_DST_DIR := $(NDK_APP_DST_DIR)
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a-hard)
NDK_APP_DST_DIR := assets/armeabi-v7a
else
NDK_APP_DST_DIR := assets/$(TARGET_ARCH_ABI)
endif
LOCAL_MODULE := run_pie
LOCAL_SRC_FILES := run_pie.c
include $(BUILD_EXECUTABLE)
NDK_APP_DST_DIR := $(SAVED_NDK_APP_DST_DIR)
Долго: в моем приложении для Android я использую набор автономных двоичных файлов. После сборки они сохраняются в APK ресурсах. При первом запуске приложения я копирую их в личную папку своего приложения, chmod 777, и затем использую их в качестве системных утилит, таких как "ls" или "cp". Я хочу создать "толстый двоичный файл": один APK, который имеет двоичные файлы для всех ABI и выбрать правильный двоичный файл для текущего устройства после установки. Для.so библиотек Android все это делает автоматически. И "APP_ABI:= armeabi-v7a-hard" является внутренним для системы сборки NDK, это указано в документации, а окончательные файлы.so для "armeabi-v7a-hard" находятся в папке "armeabi-v7a". Я могу сделать то же самое для моих двоичных файлов, и в настоящее время у меня есть способ, который работает, однако это выглядит некрасиво.
Как правильно разместить выходные двоичные файлы в пользовательских папках с именами ABI и обрабатывать преобразование "armeabi-v7a-hard" в "armeabi-v7a"?
1 ответ
Если вы посмотрите в $NDK/build/core/setup-toolchain.mk
там вы найдете следующие строки:
# compute NDK_APP_DST_DIR as the destination directory for the generated files
NDK_APP_DST_DIR := $(NDK_APP_LIBS_OUT)/$(TARGET_ARCH_ABI)
# install armeabi-v7a-hard to lib/armeabi-v7a, unless under testing where env. var. _NDK_TESTING_ALL_
# is set to one of yes, all, all32, or all64
ifeq (,$(filter yes all all32 all64,$(_NDK_TESTING_ALL_)))
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a-hard)
NDK_APP_DST_DIR := $(NDK_APP_LIBS_OUT)/armeabi-v7a
endif
endif
Итак, как вы видите, это тот же подход, что и вы в Android.mk
, Разница лишь в том, что вы не принимаете во внимание _NDK_TESTING_ALL_
, которая является внутренней для системы тестирования NDK. Так что просто продолжайте использовать свой Android.mk
как есть и не волнуйтесь.
Другой подход заключается в сборке ваших исполняемых файлов как обычно, но назовите их как lib${TOOLNAME}.so
, В этом случае они будут помещены в дефолт NDK_APP_DST_DIR
а также реальные библиотеки, и при установке на устройство, Android Package Manager скопирует их в нужное место. Затем при первом запуске вы можете скопировать их из lib
папку (а не из ресурсов, как вы делаете в настоящее время), и переименуйте соответствующим образом.