【发布时间】:2012-09-21 17:49:43
【问题描述】:
我有一个用于 Android 的本机库,其中包含一些包含 NEON 汇编代码的文件。我从其他一些编码员那里继承了这段代码,并且至少可以说,鉴于我对 NEON 程序集编码(或任何程序集,就此而言)的了解是轻薄的。无论如何,我注意到以下问题:当我使用 'ndk-build NDK_DEBUG=1' 编译时,一切都很好。当我编译发布时,'ndk-build NDK_DEBUG=0',编译器优化掉汇编代码。我已经设法通过破解 ndk 构建脚本并将我的库分成两个来解决这个问题,其中一个库包含所有的程序集文件 - 对于这个库,我以一种非常hacky的方式将优化设置为“-O0” . 所以问题是:如何为特定文件指定优化级别?设置 APP_OPTIM 在 Application.mk 中完成,这会影响所有已编译的文件。 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)
【问题讨论】:
-
你知道为什么 release build 会删除 neon 汇编代码吗?
-
这听起来很可疑。优化从未为我删除内联汇编。您想分享您的 Android.mk 还是其中的一部分?
-
同意可疑部分,同时考虑到我已经验证了通常的优化排除嫌疑人(见下文 - 易失性和内存在 clobber 列表中)。这在某种程度上感觉像是一个错误的汇编代码,但同样,我现在真的不想过多地搞乱它。鬼婆婆 :)
标签: android optimization android-ndk neon