CMAKE未遵循Gradle的标志进行Android NDK构建

3

我是一名有用的助手,可以为您进行翻译。以下是需要翻译的内容:

我有一个Android NDK项目,正在尝试通过Gradle+CMake构建。

build.gradle:

apply plugin: 'com.android.library'

allprojects {
    repositories {
        jcenter()
        google()
    }
}

android {
    compileSdkVersion 27
    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        externalNativeBuild {
            cmake {
                cppFlags "-std=c++11"
                arguments "-DANDROID_ABI=armeabi-v7a",
                          "-DANDROID_PLATFORM=android-16",
                          "-DANDROID_STL=gnustl_static",
                          "-DANDROID_CPP_FEATURES=rtti exceptions",
                          "-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=libs"
            }
        }
    }

    buildTypes {
        release {
            ndk {
                abiFilters "armeabi-v7a"
            }
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            ndk {
                abiFilters "armeabi-v7a"
            }
        }
    }
    externalNativeBuild {
        cmake {
            path 'CMakeLists.txt'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
}

**CMAKE命令输出:**
Executable : /Users/ssk/Library/Android/sdk/cmake/3.6.3155560/bin/cmake
arguments : 
-H/Users/ssk/MyProject
-B/Users/ssk/MyProject/.externalNativeBuild/cmake/debug/armeabi-v7a
-DANDROID_ABI=armeabi-v7a
-DANDROID_PLATFORM=android-16
------> -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/ssk/MyProject/build/intermediates/cmake/debug/obj/armeabi-v7a
-DCMAKE_BUILD_TYPE=Debug
-DANDROID_NDK=/Users/ssk/Library/Android/sdk/ndk-bundle
-DCMAKE_CXX_FLAGS=-std=c++11
-DCMAKE_TOOLCHAIN_FILE=/Users/ssk/Library/Android/sdk/ndk-bundle/build/cmake/android.toolchain.cmake
-DCMAKE_MAKE_PROGRAM=/Users/ssk/Library/Android/sdk/cmake/3.6.3155560/bin/ninja
-GAndroid Gradle - Ninja
-DANDROID_STL=gnustl_static
-DANDROID_ABI=armeabi-v7a
-DANDROID_PLATFORM=android-16
-DANDROID_CPP_FEATURES=rtti exceptions
------> -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=libs
jvmArgs : 

我正在尝试使用DCMAKE_LIBRARY_OUTPUT_DIRECTORY来配置输出目录,但它没有遵从。Gradle在我的选项之前添加了一个默认值,如下所示(在cmake命令输出中突出显示------> )。
问题:
如何配置输出目录?
2个回答

5
以下代码片段将配置您的输出目录:
对于静态库输出目录,请尝试以下操作:
# copy out the static lib binary 
set_target_properties(${STATIC_LIBRARY_NAME}
                      PROPERTIES
                      ARCHIVE_OUTPUT_DIRECTORY "libs/${ANDROID_ABI}")

对于共享库输出目录,请尝试以下方法:

# copy out the shared lib binary 
set_target_properties(${SHARED_LIBRARY_NAME}
                      PROPERTIES
                      LIBRARY_OUTPUT_DIRECTORY "libs/${ANDROID_ABI}")

解释

ANDROID_ABI 是一个定义 Android ABI 的变量,例如 armeabi-v7a

CMake 变量定义的参考资料:

CMake 构建工具链中用于 "strip" 命令的 Android NDK 路径变量


3
也许您需要设置 buildStagingDirectory 选项。在下面的链接中,您将找到有关如何在gradle中管理CMake路径的信息:

CMakeOptions

另外,与问题无关的一点提示:在您的gradle脚本中似乎仍在使用不再支持并将在下一个NDK版本中删除的 gnustl_static。您应该切换到 c++_staticc++_shared。请注意,gcc 已被弃用,您应该使用 clang。以下是一个示例:
externalNativeBuild {
            cmake {
                arguments "-DANDROID_PLATFORM=android-16", "-DANDROID_STL=c++_static", "-DANDROID_TOOLCHAIN=clang"
                abiFilters "armeabi-v7a", "arm64-v8a", "x86"
            }
        }

1
只是想指出,使用-DANDROID_PLATFORM并不好,minSdkVersion应该是管理平台版本的正确方式,更多细节请参见https://dev59.com/vLHma4cB1Zd3GeqPM4e-#54473346。 - shizhen
不要直接更改此标志,而应在“module-level build.gradle”文件的“defaultConfig”或“productFlavors”块中设置“minSdkVersion”属性。这可以确保您的库仅由在运行足够版本的Android设备上安装的应用程序使用。 这是官方文档的说法。 - shizhen
  1. 如果存在 ABI 版本等于 minSdkVersion 的平台版本,则 CMake 使用该版本。
  2. 否则,如果存在 ABI 的平台版本低于 minSdkVersion,则 CMake 使用这些平台版本中最高的版本。这是一个合理的选择,因为缺少平台版本通常意味着自上一个可用版本以来没有对本地平台 API 进行更改。
  3. 否则,CMake 将使用比 minSdkVersion 更高的下一个可用平台版本。
- shizhen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接