NEONコードを別のモジュール(静的ライブラリまたは共有ライブラリ)に配置すると、 Android.mk内のそのモジュールのCFLAGSを必要に応じて手動で調整できます。
組み込み関数の周りに#ifdef__ARM_NEON__を使用するCファイルがある場合、最良の選択は、これらのファイルを共有ライブラリに配置することです。1つはv6用にコンパイルされ、もう1つはneon用にコンパイルされます。
私は通常、このような「補足」ライブラリをJavaから直接ロードするため、メインのネイティブコードはこれらの変更をまったく気にしません。
更新:静的ライブラリを使用する簡単な例を次に示します。
Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := neon_utils
LOCAL_SRC_FILES := neon_add.c
LOCAL_CFLAGS += -mfloat-abi=softfp -mfpu=neon -march=armv7
include $(BUILD_STATIC_LIBRARY)
NDK_PATH:=$(call my-dir)/../..
include $(CLEAR_VARS)
LOCAL_MODULE := test_conditional_load
LOCAL_C_INCLUDES := $(NDK_PATH)/sources/cpufeatures
LOCAL_SRC_FILES := main.c
LOCAL_STATIC_LIBRARIES := neon_utils cpufeatures
include $(BUILD_EXECUTABLE)
include $(NDK_PATH)/sources/cpufeatures/Android.mk
main.c
#include <stdio.h>
#include <cpu-features.h>
void neon_add(int32_t * ptr);
int main()
{
int32_t int32_4[] = {2,3,4,5};
if (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON)
{
neon_add(int32_4);
printf("neon\n");
}
else
{
printf("not neon\n");
}
printf("values = %d, %d, %d, %d\n", int32_4[0], int32_4[1], int32_4[2], int32_4[3]);
return 0;
}
neon_add.c
#include <arm_neon.h>
void neon_add(int32_t * ptr)
{
int32x4_t vin = vld1q_s32(ptr);
int32x4_t vout = vaddq_s32(vin, vin);
vst1q_s32(ptr, vout);
}