代码之家  ›  专栏  ›  技术社区  ›  ssk

CMAKE不遵守android上ndk构建的Gradle标志

  •  2
  • ssk  · 技术社区  · 6 年前

    我有一个android ndk项目,我正试图通过Gradle+CMake来构建它。

    年级学生:

    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 回复  |  直到 6 年前
        1
  •  2
  •   shizhen    6 年前

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

    为了 静止的 lib输出目录,请尝试以下操作:

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

    为了 共享 lib输出目录,请尝试以下操作:

    # 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变量定义的参考:

    Android NDK path variable for "strip" command in CMake build tool chain

        2
  •  2
  •   Perraco    6 年前

    可能你需要设置 构建阶段目录 选择权。在下一个链接中,您将找到如何管理渐变中的cmake路径:

    CMakeOptions

    作为与问题无关的旁注。在Gradle脚本中,您似乎仍在使用 静态的,静态的 它不再受支持,将在下一个NDK版本中删除。你应该切换到 C++静态 C++共享 . 考虑到这一点 海湾合作委员会 已弃用,应使用 铿锵声 . 接下来是一个例子:

    externalNativeBuild {
                cmake {
                    arguments "-DANDROID_PLATFORM=android-16", "-DANDROID_STL=c++_static", "-DANDROID_TOOLCHAIN=clang"
                    abiFilters "armeabi-v7a", "arm64-v8a", "x86"
                }
            }