由于我有一个处理能力很强的应用程序,我想用 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
内置霓虹灯物体。
有没有办法可以在一件优雅的事情中解决这个问题?
答案 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。