LINUX.ORG.RU

История изменений

Исправление 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.