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

问题描述 投票:6回答:2

我有一个带有基于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) )。

谢谢大家的时间!

android gradle android-ndk cmake
2个回答
5
投票

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


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()
© www.soinside.com 2019 - 2024. All rights reserved.