如何使用Gradle为Android NDK指定外部C ++源文件夹

时间:2015-07-08 20:41:09

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

我想在我的Android Studio项目中添加一些不在项目树中的C ++源文件。我是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'
    }
}

3 个答案:

答案 0 :(得分:4)

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

  

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

     

您希望NDK工具链默认编译的代码将   位于(模块)/ 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/'

答案 1 :(得分:1)

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

在下一个示例中,包含两个文件夹,当前主文件夹(' src / main / jni')和第二个文件夹(' ../../ common&# 39;)超出android项目文件夹树:

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 :(得分:0)

在这里,你明白了:

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"])
}