【问题标题】:Android NDK: How to get compiler architecture in Android.mk dynamicallyAndroid NDK:如何在 Android.mk 中动态获取编译器架构
【发布时间】:2012-09-18 19:52:15
【问题描述】:

我正在尝试配置 Android.mk 以交叉编译本机代码以支持不同的芯片组,即 armeabi、mips 和 x86。我知道我可以通过以下方式配置 Application.mk 来编译不同芯片组的源代码:

APP_ABI := all

这将触发 Android-NDK 的构建脚本来编译所有芯片组的源代码。但是,我想动态地告诉 Android.mk 寻找使用不同芯片组编译的不同静态库依赖项。

# Get the architecture info
ARCH := ????

include $(CLEAR_VARS)
LOCAL_MODULE:= mylib
LOCAL_SRC_FILES:= build/lib/libxxx_$(ARCH).a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
include $(PREBUILT_STATIC_LIBRARY)

这可能吗?如果是这样,任何人都可以建议如何做到这一点?

更新:我在 Application.mk 中尝试过这样的事情:

 APP_ABI := armeabi armeabi-v7a mips x64

使用 Android.mk:

# Get the architecture info
ARCH := $(APP_ABI)

include $(CLEAR_VARS)
LOCAL_MODULE:= mylib
LOCAL_SRC_FILES:= build/lib/libxxx_$(ARCH).a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
include $(PREBUILT_STATIC_LIBRARY)

但出现以下错误:

 The LOCAL_SRC_FILES for a prebuilt static library should only contain one item

这是有道理的。我想在 Application.mk 中传递 APP_ABI := all 并能够 动态引用它。有什么想法吗?

【问题讨论】:

  • 如果您查看 ndk 和其他库,他们使用诸如 #ifdef __arm__ 之类的定义,但我不确定它是在哪里定义或标准化的
  • 嗨,我想做同样的事情。你能给我举个 Andorid.mk 文件的例子,以及把它放在应用程序的什么地方吗??

标签: android android-ndk


【解决方案1】:

TARGET_ARCH 变量保存了当前正在构建的 ABI 的值。您可以通过以下方式使用它:

ifeq ($(TARGET_ARCH),x86)
    LOCAL_CFLAGS   := $(COMMON_FLAGS_LIST)
else
    LOCAL_CFLAGS   := -mfpu=vfp -mfloat-abi=softfp $(COMMON_FLAGS_LIST)
endif

如果您在Application.mk 中指定APP_ABI := armeabi-v7a armeabi mips x86APP_ABI := all,您将获得每一个单独的ABI 值。

【讨论】:

  • 谢尔盖您好,感谢您的回答。它就像一个魅力!我也很感激你给了我一个例子,说明我如何更好地使用它。编译时我也收到了 fp 警告,但这也解决了该警告:)
  • 仅供参考,不确定您是否打算将您的代码作为额外帮助,但我还是尝试了,因为我很好奇 :) LOCAL_CFLAGS := -mfpu=vfp -mfloat-abi=softfp。我观察到它在编译 mips 架构时出错,它出现以下错误:cc1plus: error: unrecognized command line option "-mfpu=vfp" cc1plus: error: unrecognized command line option "-mfloat-abi=softfp"。这意味着正确的代码 sn-p 将是 LOCAL_CFLAGS 将是 ifeq ($(TARGET_ARCH),arm) LOCAL_CFLAGS := -mfpu=vfp -mfloat-abi=softfp $(COMMON_FLAGS_LIST) 否则 LOCAL_CFLAGS := $(COMMON_FLAGS_LIST)。万一。对吗?
  • 不适用于 arm64-v8a,它返回 arm64。另一个答案(TARGET_ARCH_ABI)是正确的。
  • @Karu:这是 2.5 年前回答的。当时看不到arm64-v8a。
  • 没关系,但我昨天读了。昨天是不正确的,所以我昨天投了反对票。
【解决方案2】:

查看TARGET_ARCH_ABI:

ifeq($(TARGET_ARCH_ABI), armeabi-v7a)
  # v7a-specific stuff
endif

【讨论】:

  • $TARGET_ARCH_ABI 只返回我在 APP_ABI 中设置的任何内容。有什么方法可以通过 APP_ABI := armeabi armeabi-v7a mips x64 或 APP_ABI := all?
  • 必须在Application.mk中设置APP_ABI := all,否则ndk-build只会使用默认的armeabi架构。对于多种架构,NDK 将迭代调用您的 Android.mk 文件 - 每次设置 $(TARGET_ARCH_ABI) 不同。
  • 我以为他在Android.mk 中设置了APP_ABI,但我看错了。对不起。
  • ifneq (,$(filter $(TARGET_ARCH_ABI),armeabi armeabi-v7a)) 用于多拱:stackoverflow.com/questions/7656425/makefile-ifeq-logical-or
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
相关资源
最近更新 更多