同时构建ARMv7a常规和霓虹灯

时间:2013-04-07 16:31:54

标签: android-ndk makefile neon

由于我有一个处理能力很强的应用程序,我想用 NEON / 高级SIMD 支持构建一个变体。另外我有多个带算法的源文件,所以我不想单独为每个文件启用neon。 遵循Android.mk的重要部分:

ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)

include $(CLEAR_VARS)
# Build Advanced SIMD variant
LOCAL_MODULE            := mymod-neon
LOCAL_ARM_NEON          := true
LOCAL_ARM_MODE          := $(MY_ARM_MODE)
LOCAL_SRC_FILES         := $(MY_SRC_FILES)
LOCAL_C_INCLUDES        := $(MY_C_INCLUDES)
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)
LOCAL_SHARED_LIBRARIES  := $(MY_SHARED_LIBRARIES)
include $(BUILD_SHARED_LIBRARY)

endif

include $(CLEAR_VARS)
# Build regular variant
LOCAL_MODULE            := mymod
LOCAL_ARM_MODE          := $(MY_ARM_MODE)
LOCAL_SRC_FILES         := $(MY_SRC_FILES)
LOCAL_C_INCLUDES        := $(MY_C_INCLUDES)
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)
LOCAL_SHARED_LIBRARIES  := $(MY_SHARED_LIBRARIES)
include $(BUILD_SHARED_LIBRARY)

我尝试为 ARMv7a 构建2个库,但遗憾的是,由于使用了“高级”Makefile工具,我无法编译2个不同的库。

它会覆盖.o目标:

/android-ndk/build/core/build-binary.mk:272: warning: overriding commands for target `obj/local/armeabi-v7a/objs/myalg.o'

可悲的是,我没有找到办法迫使objs-neon而不是obj内置霓虹灯物体。

有没有办法可以在一件优雅的事情中解决这个问题?

2 个答案:

答案 0 :(得分:1)

我最终做的是将我们的src符号链接到src-neon目录,并通过src-neon访问所有霓虹灯来源:

ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)

include $(CLEAR_VARS)
# Build Advanced SIMD variant
LOCAL_MODULE            := mymod-neon
LOCAL_ARM_NEON          := true
LOCAL_ARM_MODE          := $(MY_ARM_MODE)
LOCAL_SRC_FILES         := $(call get_sources,`src-neon`)
LOCAL_C_INCLUDES        := $(MY_C_INCLUDES)
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)
LOCAL_SHARED_LIBRARIES  := $(MY_SHARED_LIBRARIES)
include $(BUILD_SHARED_LIBRARY)

endif

include $(CLEAR_VARS)
# Build regular variant
LOCAL_MODULE            := mymod
LOCAL_ARM_MODE          := $(MY_ARM_MODE)
LOCAL_SRC_FILES         := $(call get_sources,`src`)
LOCAL_C_INCLUDES        := $(MY_C_INCLUDES)
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)
LOCAL_SHARED_LIBRARIES  := $(MY_SHARED_LIBRARIES)
include $(BUILD_SHARED_LIBRARY)

幸运的是,我们很早就决定只在Unix机器上工作,所以这对我们来说是一个可行的选择。

答案 1 :(得分:0)

是的,ndk-build应该通过调试和非调试以及ISA分离中间对象,所以实际上我认为,正如其他人所指出的那样,你可能在其他地方有错误。请注意,ndk-build将通过ISA和debug / non-debug分隔中间对象,但不是模块名称。因此,如果多个模块尝试构建相同的文件,您可能会遇到问题。

话虽如此,我想指出你可能会以一种错误的方式解决这个问题,因为armeabi-v7a并不意味着支持NEON。尽管ARM确实在推出了带有v7a的NEON,但它是供应商添加的可选协处理器,因此v7a处理器可能没有NEON协处理器。所以不幸的是,有了这些信息,你又回到了原点......

这个问题确实有点重复,在这里:

Android build system, NEON and non-NEON builds

此外,NDK构建文档确实将整个页面用于此。查看你的android-ndk-r8e / documentation.html,在左侧有一个链接到“CPU ARM Neon”

他们指出的一点是,最好的方法是通过CPU调度,但它们还会向您展示如何使用.neon额外文件扩展名将源文件标记为霓虹灯与非霓虹灯。恕我直言,将不同的CPU代码放在不同的源文件中总是好的,无论构建系统是什么,因为你可以删除很多丑陋的预处理器东西。这是我猜的最佳实践,所以这就是NDK所支持的。

在完成所有这些之后,我发现你最终得到了LCID Fire的解决方案。您使用略有不同的源文件构建不同的库。你应该有3个不同的库,一个用于非v7a,一个用于v7a和霓虹灯,一个用于没有霓虹灯的v7a。