Android NDK:为不同CMake目标指定差异化编译参数
解决方案
有两种可行方式实现不同原生库的差异化编译配置,以下是具体操作:
方法一:在build.gradle中为每个目标单独配置参数
Android Gradle插件支持为不同原生目标分别指定编译参数,你可以拆分externalNativeBuild中的cmake块,为不同目标组配置对应参数:
修改后的build.gradle相关代码:
externalNativeBuild { // 为mali_info和adreno_info配置(继承项目minSdkVersion 16) cmake { targets 'mali_info', 'adreno_info' arguments "-DANDROID_ARM_NEON=TRUE" // 若这两个库不需要NEON,可移除该参数 } // 单独为vulkan_info配置专属参数 cmake { targets 'vulkan_info' arguments "-DANDROID_ARM_NEON=TRUE", "-DANDROID_PLATFORM=android-24" } }
配置完成后,低版本兼容的两个库会使用项目默认的minSdkVersion 16编译,vulkan_info则强制使用android-24平台编译。
方法二:在CMakeLists.txt中针对目标设置编译属性
如果更倾向于在CMake层面控制,可以为vulkan_info单独指定Android平台版本,同时保留其他库的默认配置:
修改后的CMakeLists.txt相关代码:
cmake_minimum_required(VERSION 3.4.1) add_library( adreno_info SHARED src/main/cpp/adreno_info.cpp ) target_link_libraries( adreno_info log ) add_library( mali_info SHARED src/main/cpp/mali_info.cpp ) target_link_libraries( mali_info log ) add_library( vulkan_info SHARED src/main/cpp/vulkan_info.cpp ) # 为vulkan_info单独设置Android平台版本和NEON属性 set_target_properties(vulkan_info PROPERTIES ANDROID_PLATFORM "android-24" ANDROID_ARM_NEON TRUE ) target_link_libraries( vulkan_info vulkan log )
同时修改build.gradle,移除全局的-DANDROID_PLATFORM=android-24参数,避免影响其他库:
externalNativeBuild { cmake { targets 'mali_info', 'adreno_info', 'vulkan_info' arguments "-DANDROID_ARM_NEON=TRUE" // 若仅vulkan_info需要NEON,可移除该全局参数,仅在CMake中为vulkan_info设置 } }
这种方式把编译配置细节放在CMake脚本中,更适合原生代码的统一管理。
内容的提问来源于stack exchange,提问作者flar2
相关产品推荐
相关产品推荐

