【问题标题】:How to specify external C++ source folders for Android NDK with Gradle如何使用 Gradle 为 Android NDK 指定外部 C++ 源文件夹
【发布时间】:2015-09-26 23:45:41
【问题描述】:

我想将一些不在项目树中的 C++ 源文件添加到我的 Android Studio 项目中。我是 Gradle 的新手,并试图尽可能多地研究这个。根据我阅读的内容,以下 build.gradle 文件应该可以工作,但不能。关于jni.sourceDirs 的部分来自这篇文章:http://www.shaneenishry.com/blog/2014/08/17/ndk-with-android-studio/

这是正确的方法吗?

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"
    defaultConfig {
        applicationId "com.mycompany.myapp"
        minSdkVersion 22
        targetSdkVersion 22

        ndk {
            moduleName "mymodule"
            ldLibs "log"
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }

    sourceSets.main {
        jni.srcDirs '../external/source/dir'
    }
}

【问题讨论】:

  • 我在重新指定 srcDirs 时遇到了麻烦,但我认为对我有用的一件事是使用绝对路径(嗯,相对于 projectDirs) - 原因是你'正在覆盖 srcDirs 属性 - 所以你不能假设目录从你认为的地方开始

标签: android android-studio android-ndk android-gradle-plugin build.gradle


【解决方案1】:

目前,使用 'gradle-experimental:0.7.3' 这个定义稍微改变了一点。 在这个新版本中,要设置为“srcDirs”的对象必须是一个可迭代的对象,因此可以包含多个 c++ 源路径。

在下一个示例中,包含两个文件夹,当前主文件夹 ('src/main/jni'),以及 android 项目文件夹树中的第二个文件夹 ('../../common') :

apply plugin: 'com.android.model.application'

model {
    android {
        compileSdkVersion  23
        buildToolsVersion  "23.0.2"
        defaultConfig.with {
            applicationId  "com.test.androidTest"
            minSdkVersion.apiLevel  21
            targetSdkVersion.apiLevel  23
            versionCode = 1
            versionName = "1.0"
       }
    }

    android.ndk {
        moduleName = "jni_lib_name"
        platformVersion = 9
        toolchain "gcc"
        debuggable true
        cppFlags.add("-fexceptions")
        cppFlags.add("-std=c++14")

        ....
    }

    android {
        sources {
            main {
                jni {
                    source {
                        srcDirs = ["src/main/jni".toString(), "../../common".toString()]
                    }
                }
            }
        }
    }

    ...
}

【讨论】:

    【解决方案2】:

    这里,你明白了:

    android.ndk {
        moduleName = "mydemo"
    
        //Specify a library relative to this project path
        CFlags.add('-I' + String.valueOf(project.buildDir) + '/../my/inc/path')
    
        //or CPP
        cppFlags.add('-I' + String.valueOf(project.buildDir) + '/../my/inc/path')
    
        //Linker works the same way
        ldFlags.add("-L/custom/lib/path")
        ldLibs.addAll(["log", "GLESv2", "myCustomLibrary"])
    }
    

    【讨论】:

      【解决方案3】:

      看看我关于这个的文章: http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/

      这里有两件事你需要知道。默认情况下,如果您有 您想要加载到 Android 应用程序中的外部库,它们 在(模块)/src/main/jniLibs 中查找。你可以改变这个 通过在你的模块中设置 sourceSets.main.jniLibs.srcDirs 构建.gradle。您需要一个包含每个库的子目录 您的目标架构(例如 x86、arm、mips、arm64-v8a 等……)

      你想被NDK工具链默认编译的代码会 位于 (module)/src/main/jni 和上面类似,你可以 通过在你的模块中设置 sourceSets.main.jni.srcDirs 来改变它 build.gradle

      以及来自该页面的示例 Gradle 文件:

      apply plugin: 'com.android.application'
      
      android {
          compileSdkVersion 21
          buildToolsVersion "21.1.2"
      
          defaultConfig {
              applicationId "com.sureshjoshi.android.ndkexample"
              minSdkVersion 15
              targetSdkVersion 21
              versionCode 1
              versionName "1.0"
      
              ndk {
                  moduleName "SeePlusPlus" // Name of C++ module (i.e. libSeePlusPlus)
                  cFlags "-std=c++11 -fexceptions" // Add provisions to allow C++11 functionality
                  stl "gnustl_shared" // Which STL library to use: gnustl or stlport
              }
          }
      
          buildTypes {
              release {
                  minifyEnabled false
                  proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
              }
          }
      }
      

      另外,当指定 /jni 目录的外部时,请尝试使用完整的构建路径(使用宏之一,例如):

      '${project.buildDir}/../../thirdParty/blah/blah/'
      

      【讨论】:

      • 您的大部分回答并未直接解决我的问题,但感谢您对宏的了解。我确实让它工作了。我的问题是相对路径错误,宏帮我解决了这个问题。
      • 使用 ndk.cFlags(0.4 exp 中的大写 ndk.CFlags)指定库路径:-I${project.buildDir}/../src/main/jni/inc"。使用任何库的 ldFlags。我的就是这样
      猜你喜欢
      • 1970-01-01
      • 2017-11-27
      • 2016-04-30
      • 2016-04-21
      • 2012-10-31
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 2017-08-25
      相关资源
      最近更新 更多