我有一个用于 Android 的本机库,其中包含一些包含 NEON 汇编代码的文件。我从其他一些编码员那里继承了这段代码,并且至少可以说,鉴于我对 NEON 程序集编码(或任何程序集,就此而言)的了解是轻薄的。无论如何,我注意到以下问题:当我使用 'ndk-build NDK_DEBUG=1' 编译时,一切都很好。当我编译发布时,'ndk-build NDK_DEBUG=0',编译器优化掉汇编代码。我已经设法通过破解 ndk 构建脚本并将我的库分成两部分来解决这个问题,其中一个库包含所有的程序集文件 - 对于这个库,我以一种非常 hacky 的方式将优化设置为“-O0” . 所以问题是:如何为特定文件指定优化级别?在 Application.mk 中设置 APP_OPTIM,这会影响所有编译的文件。NDK_DEBUG 标志也是如此。
编辑:根据 Alex 的要求,这是我最终使用的 Android.mk,将 lib 分成两部分:一部分带有汇编代码(和 -O0),另一部分带有常规 C 代码(和 -O2):
LOCAL_PATH := $(call my-dir)
# assembly_neon_code_here (neon) module - turn optimization off
include $(CLEAR_VARS)
LOCAL_MODULE := assembly_neon_code_here
LOCAL_SRC_FILES := assembly_neon_code_here.cpp
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
LOCAL_ARM_NEON := true
endif
LOCAL_CFLAGS := -O0
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
include $(BUILD_SHARED_LIBRARY)
# main module
include $(CLEAR_VARS)
LOCAL_MODULE := complete_lib
LOCAL_SRC_FILES := regular_src1.cpp regular_src2.cpp regular_src3.cpp
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
LOCAL_ARM_NEON := true
endif
# allow logcat calls
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog -lz
LOCAL_SHARED_LIBRARIES := assembly_neon_code_here
include $(BUILD_SHARED_LIBRARY)