Android 在build.gradle中确定当前生成的ABI

Android 在build.gradle中确定当前生成的ABI,android,android-ndk,android-gradle-plugin,Android,Android Ndk,Android Gradle Plugin,在build.gradle文件中是否有方法通过编程确定当前版本的ABI(arm64-v8a、armeabi-v7a、x86等) 我尝试过创建这样的函数: def getABIFromCurrentBuild() { return android.os.Build.CPU_ABI; } productFlavors { x86 { ndk { abiFilter "x86" moduleName "myJNILib"

在build.gradle文件中是否有方法通过编程确定当前版本的ABI(arm64-v8a、armeabi-v7a、x86等)

我尝试过创建这样的函数:

def getABIFromCurrentBuild() {
    return android.os.Build.CPU_ABI;
}
productFlavors {
    x86 {
        ndk {
            abiFilter "x86"
            moduleName "myJNILib"
            cFlags "-std=c++11"
            ldLibs "GLESv3 ${project.projectDir}/../../build/local/x86/myStaticLib.a"
            stl "gnustl_shared"
        }
    }
    x86_64 {
        ndk {
            abiFilter "x86_64"
            moduleName "myJNILib"
            cFlags "-std=c++11"
            ldLibs "GLESv3 ${project.projectDir}/../../build/local/x86_64/myStaticLib.a"
            stl "gnustl_shared"
        }
    }
    ...
}
但Gradle插件无法提供android.os软件包

背景:

我在Android Studio中有一个应用程序项目,它使用JNI库。JNI库又链接到使用C++文件构建在Android Studio之外的静态C++库。但是,静态库被分为不同的版本(每个ABI一个)

我希望避免为JNI库创建Makefiles,而只是在Android Studio中我的应用程序的build.gradle文件中使用ndk块。以下是我的ndk块的外观:

ndk {
    moduleName "myJNILib"
    cFlags "-std=c++11"
    ldLibs "GLESv3 ${project.projectDir}/../../build/local/${getABIFromCurrentBuild()}/myStaticLib.a"
    stl "gnustl_shared"
}
正如您所见,在构建JNI库时,我已经将我的静态库侵入了linker命令行,但我一直在试图找出如何将它的正确版本链接到其中

我还尝试将所有ABI类型分离到productFlavors块中,如下所示:

def getABIFromCurrentBuild() {
    return android.os.Build.CPU_ABI;
}
productFlavors {
    x86 {
        ndk {
            abiFilter "x86"
            moduleName "myJNILib"
            cFlags "-std=c++11"
            ldLibs "GLESv3 ${project.projectDir}/../../build/local/x86/myStaticLib.a"
            stl "gnustl_shared"
        }
    }
    x86_64 {
        ndk {
            abiFilter "x86_64"
            moduleName "myJNILib"
            cFlags "-std=c++11"
            ldLibs "GLESv3 ${project.projectDir}/../../build/local/x86_64/myStaticLib.a"
            stl "gnustl_shared"
        }
    }
    ...
}
这样可以正确链接所有内容,但是JNI共享库只会复制到一些apk中,因为Gradle插件使用的apk命名方案比我在productFlavors中捕获的要复杂得多

例如,其中一个APK名为“app-arm64-x86_64-debug”。在这种情况下,没有匹配的ABI筛选器

更新


目前,我只需在
/app/src/main/jni/
中向静态库代码添加一个符号链接,就可以避免使用单独的静态库。这使得它直接编译到JNI库中,这本质上与链接到静态库的效果相同。此外,它还有一个好处,即Android Studio中显示了库源代码,这使其更易于访问。

实际上没有“当前版本”。像
productFlavors
闭包之类的东西正在配置一个对象模型;它们不是某种程序脚本。是的,我知道
productFlavors
构造不是为这个目的而设计的。我只是展示了它,以便更好地了解我在做什么(以及我已经尝试了什么)。