Android NDK:如何在Android.mk中动态获取编译器体系结构

Lux*_*ter 35 android android-ndk

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

APP_ABI := all
Run Code Online (Sandbox Code Playgroud)

这将触发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)
Run Code Online (Sandbox Code Playgroud)

这可能吗?如果是这样,有人可以建议如何这样做吗?

更新:我在Application.mk中尝试过类似的东西:

 APP_ABI := armeabi armeabi-v7a mips x64
Run Code Online (Sandbox Code Playgroud)

使用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)
Run Code Online (Sandbox Code Playgroud)

但它有以下错误:

 The LOCAL_SRC_FILES for a prebuilt static library should only contain one item
Run Code Online (Sandbox Code Playgroud)

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

nne*_*neo 34

检查TARGET_ARCH_ABI:

ifeq($(TARGET_ARCH_ABI), armeabi-v7a)
  # v7a-specific stuff
endif
Run Code Online (Sandbox Code Playgroud)

  • 你必须在`Application.mk`中设置`APP_ABI:= all`,否则`ndk-build`将只使用默认的`armeabi`架构.对于多种体系结构,NDK将迭代地调用您的`Android.mk`文件 - 每次设置`$(TARGET_ARCH_ABI)`的方式不同. (4认同)

Ser*_* K. 29

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

ifeq ($(TARGET_ARCH),x86)
    LOCAL_CFLAGS   := $(COMMON_FLAGS_LIST)
else
    LOCAL_CFLAGS   := -mfpu=vfp -mfloat-abi=softfp $(COMMON_FLAGS_LIST)
endif
Run Code Online (Sandbox Code Playgroud)

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

  • 不适用于arm64-v8a,它返回arm64.另一个答案(TARGET_ARCH_ABI)是正确的. (6认同)
  • 那很好,但我昨天读了.昨天这是不正确的,所以我昨天对它进行了投票. (2认同)