使用Gradle CMake项目链接STL库

时间:2017-09-07 22:34:40

标签: android stl cmake android-ndk android-gradle

我有简单的Gradle项目并尝试使用CMake添加构建它的本机库

Root CMakeLists.txt

project(mine_lib)
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
set(EXECUTABLE_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/bin")

configure_file("${PROJECT_SOURCE_DIR}/src/buildinfo/buildinfo.hpp.in" "${PROJECT_BINARY_DIR}/buildinfo.hpp")

set(CMAKE_VERBOSE_MAKEFILE on)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${warnings}")
set(CMAKE_C_FLAGS   "${CMAKE_C_FLAGS} ${warnings}")

add_subdirectory(${PROJECT_SOURCE_DIR}/src)

include_directories(${PROJECT_SOURCE_DIR}/src/data)
include_directories("${PROJECT_BINARY_DIR}")

add_library(mine_lib SHARED "${PROJECT_SOURCE_DIR}/src/jni/jniwrapper.c")

的build.gradle

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.3"
    defaultConfig {
        applicationId "..."
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"

        defaultConfig {
            externalNativeBuild {
                cmake {
                    arguments "-DANDROID_STL=system"
                    cppFlags "-fexceptions"
                }
            }
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    externalNativeBuild {
        cmake {
            path "src/main/mine_lib/CMakeLists.txt"
        }
    }

    sourceSets {
        main {
            jniLibs.srcDirs 'src/main/mine_lib/src/'
        }
    }
}

在我的本机库中,我使用STL库的一部分,例如cstdint。现在我收到编译错误,看起来像这样:

Error:FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:externalNativeBuildDebug'.
> Build command failed.
  Error while executing process /AndroidSDK/android-sdk-macosx/cmake/3.6.4111459/bin/cmake with arguments {--build /Users/user/IdeaProjects/Sandbox/MyApp/app/.externalNativeBuild/cmake/debug/mips64 --target mine_lib}
  [1/2] Building C object CMakeFiles/mine_lib.dir/src/jni/jniwrapper.c.o
  FAILED: /AndroidSDK/android-sdk-macosx/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang  --target=mips64el-none-linux-android --gcc-toolchain=/AndroidSDK/android-sdk-macosx/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/darwin-x86_64 --sysroot=/AndroidSDK/android-sdk-macosx/ndk-bundle/sysroot -Dheif_EXPORTS -I/Users/user/IdeaProjects/Sandbox/HEIFGallery/app/src/main/mine_lib/src/reader -I. -isystem /AndroidSDK/android-sdk-macosx/ndk-bundle/sysroot/usr/include/mips64el-linux-android -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -fintegrated-as -Wa,--noexecstack -Wformat -Werror=format-security   -O0 -fno-limit-debug-info  -fPIC -MD -MT CMakeFiles/mine_lib.dir/src/jni/jniwrapper.c.o -MF CMakeFiles/mine_lib.dir/src/jni/jniwrapper.c.o.d -o CMakeFiles/mine_lib.dir/src/jni/jniwrapper.c.o   -c /Users/user/IdeaProjects/Sandbox/MyApp/app/src/main/mine_lib/src/jni/jniwrapper.c
  In file included from /Users/user/IdeaProjects/Sandbox/MyApp/app/src/main/mine_lib/src/jni/jniwrapper.c:2:
  /Users/user/IdeaProjects/Sandbox/MyApp/app/src/main/mine_lib/src/data/dataparser.hpp:16:10: fatal error: 'cstdint' file not found
  #include <cstdint>
           ^~~~~~~~~
  1 error generated.
  ninja: build stopped: subcommand failed.


* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED in 0s

问题到底是什么,我该如何解决?

1 个答案:

答案 0 :(得分:0)

根据我的理解,可以通过使用不同的C ++库来解决问题。

目前,您在arguments "-DANDROID_STL=system" 文件中指定了以下内容:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .antMatchers("/").permitAll()
            .antMatchers("/investors/**").hasAnyRole("ADMIN")
            .antMatchers("/search**").authenticated()
            .anyRequest().fullyAuthenticated()
            .and()
            .formLogin()
            .loginPage("/login")
            .usernameParameter("username")  < - 
            .passwordParameter("password")  < -
            .permitAll()
            .and()
            .logout()

如以下enter image description here所述,其中包括:

  

system:最小系统C ++运行时库和默认运行时

您可能需要将其更改为另一个C ++库,但我不确定它是哪一个,可能是gnu选项之一。更好的是,它可以通过完全删除声明来解决。