История изменений
Исправление waker, (текущая версия) :
ну прямая аналогия — это, например, armv6 vs armv7a+neon, причем на некоторых девайсах с armv7a нет neon (тегры какие-то)
подключаешь оба ABI в Application.mk:
APP_ABI := armeabi armeabi-v7a
потом делаешь что-то вроде такого в Android.mk
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
LOCAL_CFLAGS += -DUSE_NEON -DUSE_ASM
LOCAL_SRC_FILES += myasmcode.S
endif
т.е. дефайнами говоришь, что надо использовать neon и ассемблерные оптимизации, и подключаешь ассемблерный исходник.
дальше, в коде делаешь как-то так:
#include <cpu-features.h>
....
int neon_supported = 0;
int armv7a_supported = 0;
int vfp_supported = 0;
....
uint64_t features = android_getCpuFeatures ();
if (android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM) {
if (features & ANDROID_CPU_ARM_FEATURE_NEON) {
neon_supported = 1;
}
if (features & ANDROID_CPU_ARM_FEATURE_ARMv7) {
armv7a_supported = 1;
}
if (features & ANDROID_CPU_ARM_FEATURE_VFPv3) {
vfp_supported = 1;
}
}
....
#if defined(USE_NEON) && defined(USE_ASM)
if (neon_supported) call_asm_functions ();
else call_c_functions ();
#endif
я так делаю. под x86 у меня специальных оптимизаций на андроиде пока нет, только под ARM.
Исправление waker, :
ну прямая аналогия — это, например, armv6 vs armv7a+neon, причем на некоторых девайсах с armv7a нет neon (тегры какие-то)
подключаешь оба ABI в Application.mk:
APP_ABI := armeabi armeabi-v7a
потом делаешь что-то вроде такого в Android.mk
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
LOCAL_CFLAGS += -DUSE_NEON -DUSE_ASM
LOCAL_SRC_FILES += myasmcode.S
endif
т.е. дефайнами говоришь, что надо использовать neon и ассемблерные оптимизации, и подключаешь ассемблерный.
дальше, в коде делаешь как-то так:
#include <cpu-features.h>
....
int neon_supported = 0;
int armv7a_supported = 0;
int vfp_supported = 0;
....
uint64_t features = android_getCpuFeatures ();
if (android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM) {
if (features & ANDROID_CPU_ARM_FEATURE_NEON) {
neon_supported = 1;
}
if (features & ANDROID_CPU_ARM_FEATURE_ARMv7) {
armv7a_supported = 1;
}
if (features & ANDROID_CPU_ARM_FEATURE_VFPv3) {
vfp_supported = 1;
}
}
....
#if defined(USE_NEON) && defined(USE_ASM)
if (neon_supported) call_asm_functions ();
else call_c_functions ();
#endif
я так делаю. под x86 у меня специальных оптимизаций на андроиде пока нет, только под ARM.
Исходная версия waker, :
ну прямая аналогия — это, например, armv6 vs armv7a+neon, причем на некоторых девайсах с armv7a нет neon (тегры какие-то)
подключаешь оба ABI в Application.mk:
APP_ABI := armeabi armeabi-v7a
потом делаешь что-то вроде такого в Android.mk
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
LOCAL_CFLAGS += -DUSE_NEON -DUSE_ASM
LOCAL_SRC_FILES += myasmcode.S
endif
т.е. дефайнами говоришь, что надо использовать neon и ассемблерные оптимизации, и подключаешь ассемблерный.
дальше, в коде делаешь как-то так:
#include <cpu-features.h>
....
int neon_supported = 0;
int armv7a_supported = 0;
int vfp_supported = 0;
....
uint64_t features = android_getCpuFeatures ();
if (android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM) {
if (features & ANDROID_CPU_ARM_FEATURE_NEON) {
neon_supported = 1;
}
if (features & ANDROID_CPU_ARM_FEATURE_ARMv7) {
armv7a_supported = 1;
}
if (features & ANDROID_CPU_ARM_FEATURE_VFPv3) {
vfp_supported = 1;
}
}
....
#ifdef USE_NEON && USE_ASM
if (neon_supported) call_asm_functions ();
else call_c_functions ();
#endif
я так делаю. под x86 у меня специальных оптимизаций на андроиде пока нет, только под ARM.