Android NDK:使用 BUILD_EXECUTABLE 和 armeabi-v7a-hard 构建胖二进制文件

Android NDK: build fat binary with BUILD_EXECUTABLE and armeabi-v7a-hard

简而言之: Android NDK 系统如何将 "APP_ABI := armeabi-v7a-hard" 转换为位于 "libs/armeabi-v7a" 中的最终 .so 文件?在 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)

Long: 在我的 Android 应用程序中,我使用了一组独立的二进制文件。构建后,它们存储在 APK 资源中。在第一次启动应用程序时,我将它们复制到我的应用程序私有文件夹 chmod 777,然后将它们用作系统实用程序,如 "ls" 或 "cp"。我想生成 "fat binary": 具有所有 ABI 二进制文件的单个 APK,并在安装后为当前设备选择正确的二进制文件。对于 .so 库 Android 自动完成所有这些工作。 "APP_ABI := armeabi-v7a-hard" 是 NDK 构建系统内部的,它在文档中有说明,"armeabi-v7a-hard" 的最终 .so 文件放在 "armeabi-v7a" 文件夹中。我可以为我的二进制文件做同样的事情,目前我有办法工作,但它看起来很难看。

将输出二进制文件放置到以 ABI 命名的自定义文件夹并处理 "armeabi-v7a-hard" 到 "armeabi-v7a" 转换的正确方法是什么?

如果您查看 $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 测试系统内部的 _NDK_TESTING_ALL_。因此,请继续按原样使用您的 Android.mk,不要担心。

另一种方法是像往常一样构建可执行文件,但将它们命名为 lib${TOOLNAME}.so。在这种情况下,它们将被放置到默认 NDK_APP_DST_DIR 以及真实库中,并且在设备上安装时,Android 包管理器会将它们复制到适当的位置。然后,在第一个 运行 上,您可以从 lib 文件夹中复制它们(而不是像您目前所做的那样从资产中复制),并适当地重命名。