确定build.gradle中当前构建的ABI

cod*_*ely 6 android android-ndk android-gradle-plugin

有没有办法以编程方式确定build.gradle文件中当前版本的ABI(arm64-v8a,armeabi-v7a,x86等)?

我试过创建一个这样的函数:

def getABIFromCurrentBuild() {
    return android.os.Build.CPU_ABI;
}
Run Code Online (Sandbox Code Playgroud)

但是Gradle插件无法使用android.os包.

背景:

我在Android Studio中有一个使用JNI库的应用程序项目.反过来,JNI库链接到使用Makefiles在Android Studio外部构建的静态C++库.但是,静态库被拆分为不同的版本(每个ABI一个版本).

我想避免为JNI库创建Makefile,只需在我的应用程序的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"
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我在构建JNI库时已将我的静态库入侵到链接器命令行,但我仍然试图弄清楚如何链接其中的正确版本.

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

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"
        }
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

这使得所有内容都正确链接,但是由于Gradle插件使用的apk命名方案比我在productFlavors中捕获的更复杂,因此JNI共享库只被复制到某些apks中.

例如,其中一个apks名为"app-arm64-x86_64-debug".在这种情况下,没有匹配的ABI过滤器.

更新

现在,我只需在我的静态库代码中添加一个符号链接就可以避免使用单独的静态库<project>/app/src/main/jni/.这使它直接编译到JNI库中,这与链接到静态库的效果基本相同.此外,它还具有图书馆源代码在Android Studio中显示的优势,使其更易于访问.