可以在gradle中为每个ABI设置cmake参数吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可以在gradle中为每个ABI设置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_library
和include_directories
以及${ANDROID_ABI}
,但我已经有多平台支持的工作脚本,我不想添加脏代码,因为有干净的方式(find_package + CMAKE_PREFIX_PATH) )。
谢谢大家的时间!
这不是我们目前支持的。我认为它应该是可能的。我打开b.android.com/225884来跟踪它。
如果你刚刚在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()
以上是关于可以在gradle中为每个ABI设置cmake参数吗?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Android Studio 2.2 和 CMake 在 Android 中编译和使用依赖于 ABI 的可执行二进制文件
gradle + ndkbuild + android studio 2.2 如何设置支持的 ABI?
使用 ABI 拆分启用 externalNativeBuild
如何在 CMake 的 try_compile 函数中为 OpenMP 设置链接器标志