NEON アセンブリ コードを含むいくつかのファイルを含む Android 用のネイティブ ライブラリがあります。私はこのコードを他のコーダーから継承しましたが、控えめに言っても、NEON アセンブリ コーディング (またはその他のアセンブリ) に関する私の知識は不十分です。とにかく、次の問題に気付きました:「ndk-build NDK_DEBUG=1」でコンパイルすると、すべて問題ありません。リリース用に 'ndk-build NDK_DEBUG=0' をコンパイルすると、コンパイラはアセンブリ コードを最適化します。ndk ビルド スクリプトをハッキングし、ライブラリを 2 つに分割することで問題を回避することができました。1 つのライブラリにはすべてのアセンブリ ファイルが含まれています。このライブラリでは、非常にハックな方法で最適化を「-O0」に設定しました。 . 問題は、特定のファイルの最適化レベルを指定するにはどうすればよいかということです。APP_OPTIM の設定は Application.mk で行います。コンパイルされたすべてのファイルに影響します。NDK_DEBUG フラグも同様です。
編集: アレックスの要求に従って、これが私が最終的に使用した Android.mk であり、lib を 2 つに分割します: 1 つの部分はアセンブリ コード (および -O0) を含み、もう 1 つの部分は通常の 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)