【问题标题】:Android NDK: build fat binary with BUILD_EXECUTABLE and armeabi-v7a-hardAndroid NDK:使用 BUILD_EXECUTABLE 和 armeabi-v7a-hard 构建胖二进制文件
【发布时间】:2016-04-13 01:12:02
【问题描述】:

简短: 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”。我想生成“胖二进制文件”:具有所有 ABI 二进制文件的单个 APK,并在安装后为当前设备选择正确的二进制文件。对于 .so 库,Android 会自动完成所有这些工作。并且“APP_ABI := armeabi-v7a-hard”是 NDK 构建系统的内部,它在文档中进行了说明,“armeabi-v7a-hard”的最终 .so 文件放置在“armeabi-v7a”文件夹中。我可以为我的二进制文件做同样的事情,目前我有办法工作,但它看起来很丑。

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

【问题讨论】:

    标签: android android-ndk android-build


    【解决方案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 包管理器会将它们复制到适当的位置。然后,在第一次运行时,您可以从 lib 文件夹(而不是像您目前所做的那样从资产)复制它们,并适当地重命名。

    【讨论】:

    • 非常感谢,这正是我想要的。我试图在 NDK 源中找到那个地方,但 setup-toolchain.mk 没有引起我的注意。目前我也在寻找在运行时找到 ABI 的方法。我知道Build.CPU_ABIBuild.CPU_ABI2System.getProperty("os.arch"),但是我想在Android 软件包安装程序的源代码中找到它是如何处理的,此时几乎可以找到。但是您对lib${TOOLNAME}.so 的选择也很有趣,再次感谢。
    猜你喜欢
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2012-11-15
    • 2021-12-28
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    相关资源
    最近更新 更多