【问题标题】:Adding release and debug subdirectories to Android build with Gradle and CMake使用 Gradle 和 CMake 将发布和调试子目录添加到 Android 构建
【发布时间】:2017-04-16 13:37:47
【问题描述】:

我正在尝试将 Android NDK 项目从 Ant/ndk-build 迁移到 Gradle/CMake。我想从 Windows 上的命令行构建它。我不想使用 Android Studio。它现在几乎已经启动并运行,但还有一件事要解决,那就是:

在我的CMakeFiles.txt 中,我将其他几个包含静态链接器库的目录导入到我的项目中,如下所示:

add_subdirectory("../foobar/src" "../foobar/obj/${ANDROID_ABI}")

现在的问题是指定二进制文件的目录。我已经在使用${ANDROID_ABI} 来确保对象和库文件按体系结构分开。然而,这还不够,因为 Gradle 还将进行调试和发布构建,并且使用上面的行,调试和发布对象和库文件将被写入完全相同的目录,这将使 Gradle 每次我说的时候都重建每个静态库./gradlew build.

那么我该如何解决这个问题呢?我可以在CMakeLists.txt 中使用一个变量来告诉我 Gradle/CMake 当前是为调试还是为发布而构建?我已经尝试了以下方法,但没有成功:

IF(CMAKE_BUILD_TYPE MATCHES DEBUG)
    set(BUILDMODE "Debug")
ELSE()
    set(BUILDMODE "Release")
ENDIF()

CMAKE_BUILD_TYPE 在使用 Gradle 和 Android 插件构建时似乎总是 != DEBUG,因此 BUILDMODE 将始终是 Release

我已经考虑了好几个小时了,但我几乎没有想法......不幸的是,似乎也不可能忽略 CMake 的 add_subdirectory 的二进制文件参数。

我真的不知道在这里做什么,所以非常感谢任何帮助。

【问题讨论】:

  • 你找到解决办法了吗?
  • 是的。我现在使用add_subdirectory("libfoo" "${CMAKE_CURRENT_BINARY_DIR}/libfoo")。这可以解决问题,因为CMAKE_CURRENT_BINARY_DIR 对于调试和发布版本是不同的,但当然它仍然感觉像是一个 hack。

标签: android gradle android-ndk cmake


【解决方案1】:

根据@Andreas 的评论,这里是如何使用CMAKE_CURRENT_BINARY_DIR 在Android NDK CMake 构建中检测DebugRelease 变体:

if (CMAKE_CURRENT_BINARY_DIR MATCHES "debug")
    message(STATUS "Debug build detected")
    add_compile_options("-DANDROID_DEBUG") # <-- change this to have an effect on the build
else()
    message(STATUS "Release build detected")
endif()

【讨论】:

    【解决方案2】:

    如果没有在上游明确设置,您可能需要设置它。

    if (NOT CMAKE_BUILD_TYPE)
     SET(CMAKE_BUILD_TYPE Debug)
    endif()
    

    【讨论】:

    • 这并不能解决Android Studio中CMAKE_BUILD_TYPE不指向DebugRelease的问题,它只是始终将其设置为Debug
    猜你喜欢
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    相关资源
    最近更新 更多