在 Android 上构建 NDK 的 CMAKE 不遵守 gradle 的标志

ssk*_*ssk 3 android cmake android-ndk android-gradle-plugin

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

构建.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'])
}
Run Code Online (Sandbox Code Playgroud)

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 : 
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 配置输出目录DCMAKE_LIBRARY_OUTPUT_DIRECTORY,但它不服从。

Gradle 在我的选项之前添加了一个默认前缀,如突出显示(------> 在 cmake 命令输出中)。

题:

我应该如何配置输出目录?

shi*_*hen 5

下面的代码片段将配置您的输出目录:

对于静态库输出目录,请尝试以下操作:

# copy out the static lib binary 
set_target_properties(${STATIC_LIBRARY_NAME}
                      PROPERTIES
                      ARCHIVE_OUTPUT_DIRECTORY "libs/${ANDROID_ABI}")
Run Code Online (Sandbox Code Playgroud)

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

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

说明

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

关于 CMake 变量定义的参考:

CMake构建工具链中“strip”命令的Android NDK路径变量