如何使用Gradle启用ARM NEON构建?

时间:2016-01-23 00:19:20

标签: android android-ndk

由于Gradle似乎是谷歌在Android.mk上推出的新热点,如何为ARM构建启用NEON?我明确地对调用遗留Android.mk文件的解决方案不感兴趣,因为我想让ARM NEON构建仅使用新的Gradle系统而不是混合方法。

这是来自NDK中hello-jni项目的黑客测试build.gradle:

apply plugin: 'com.android.model.application'

model {
    android {
        compileSdkVersion = 23
        buildToolsVersion = "23.0.2"

        defaultConfig.with {
            applicationId = "com.example.hellojni"
            minSdkVersion.apiLevel = 4
            targetSdkVersion.apiLevel = 23
        }
    }

    compileOptions.with {
        sourceCompatibility=JavaVersion.VERSION_1_7
        targetCompatibility=JavaVersion.VERSION_1_7
    }

    /*
     * native build settings
     */
    android.ndk {
        moduleName = "hello-jni"
        /*
         * Other ndk flags configurable here are
         * cppFlags.add("-fno-rtti")
         * cppFlags.add("-fno-exceptions")
         * ldLibs.addAll(["android", "log"])
         * stl       = "system"
         */
        cppFlags.add("-std=c++11")
        cppFlags.add("-fexceptions")
        cppFlags.add("-DNOPENCL")
        stl = "c++_static"
    }
    android.buildTypes {
        release {
            minifyEnabled = false
            proguardFiles.add(file('proguard-rules.txt'))
        }
    }
    android.productFlavors {
        // for detailed abiFilter descriptions, refer to "Supported ABIs" @
        // https://developer.android.com/ndk/guides/abis.html#sa
        create("arm7") {
            ndk.abiFilters.add("armeabi-v7a")
        }
        create("x86") {
            ndk.abiFilters.add("x86")
        }
        create("x86-64") {
            ndk.abiFilters.add("x86_64")
        }
    }
}

但是,根据以下代码未定义__ARM_NEON__

#if defined(__arm__)
#if defined(__ARM_ARCH_7A__)
  #if defined(__ARM_NEON__)
    #if defined(__ARM_PCS_VFP)
      #define ABI "armeabi-v7a/NEON (hard-float)"
    #else
      #define ABI "armeabi-v7a/NEON"
    #endif
  #else
    #if defined(__ARM_PCS_VFP)
      #define ABI "armeabi-v7a (hard-float)"
    #else
      #define ABI "armeabi-v7a"
    #endif
  #endif
#else
 #define ABI "armeabi"
#endif
#elif defined(__i386__)
#define ABI "x86"
#elif defined(__x86_64__)
#define ABI "x86_64"
#elif defined(__mips64)  /* mips64el-* toolchain defines __mips__ too */
#define ABI "mips64"
#elif defined(__mips__)
#define ABI "mips"
#elif defined(__aarch64__)
#define ABI "arm64-v8a"
#else
#define ABI "unknown"
#endif

有什么想法?我还尝试将abiFilters设置为armeabi-v7a-hard但没有运气,并且明确地将-mfloat-abi=hard-mfpu-neon作为cppFlags传递(但这显然打破了其他平台的构建)。

0 个答案:

没有答案
相关问题