可以在gradle中为每个ABI设置cmake参数吗?

时间:2016-10-20 11:41:36

标签: android gradle android-ndk cmake

我有一个带有基于cmake的构建脚本的跨平台库。由于现在可以使用cmake对android的支持(https://developer.android.com/studio/projects/add-native-code.html),我计划将ndk-build makefile移动到垃圾箱。
我测试了find_package(ZLIB REQUIRED) 并且它运行良好,因为zlib头和库本身可用于NDK sysroot中的所有ABI。 因此,我可以为每个flavor或build类型的cmake cmdline添加任何自定义参数:

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        externalNativeBuild {
            cmake {
                arguments "-DMYLIB_ENABLE_PROGUARD=ON"
            }
        }
    }
    debug {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        externalNativeBuild {
            cmake {
                arguments "-DMYLIB_ENABLE_PROGUARD=OFF"
            }
        }
    }
}

我的问题是能够为每个ABI设置CMAKE_PREFIX_PATH以通过FindPackage查找外部静态/共享库。

一般来说,我可以在cmake脚本本身中使用find_libraryinclude_directories${ANDROID_ABI}一起使用,但我已经拥有多平台支持的工作脚本,我不想添加脏代码,因为有干净的方式(find_package + CMAKE_PREFIX_PATH)。

谢谢大家的时间!

2 个答案:

答案 0 :(得分:5)

这不是我们目前支持的内容。我认为它应该是可能的。我打开b.android.com/225884来跟踪它。

答案 1 :(得分:2)

如果你刚刚在ABI之后,你可以做一些事情,比如

if(${ANDROID_ABI} STREQUAL "x86_64")
    # ABI xx
endif()

这非常有效并且不像是黑客。我用它来构建OpenSSL(完整用法:https://github.com/schwabe/ics-openvpn/blob/master/main/src/main/cpp/openssl.cmake

如果你需要真正的口味...我想出了这种超级丑陋的黑色口味:

cmake
# Super hacky way to determine if flavour is normal
# cmake is called with the DCMAKE_LIBRARY_OUTPUT_DIRECTORY that includes the flavour (and archtecture)
#-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/arne/software/icsopenvpn/main/build/intermediates/cmake/normal/debug/obj/arm64-v8a
if (${CMAKE_LIBRARY_OUTPUT_DIRECTORY} MATCHES "build/intermediates/cmake/.*normal.*/")
  # Flavour specific
endif()