繁体   English   中英

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

[英]How to specify external C++ source folders for Android NDK with Gradle

我想将一些不在项目树中的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'
    }
}

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

您需要在这里了解两件事。 默认情况下,如果您有要加载到Android应用程序中的外部库,则在(module)/ src / main / jniLibs中查找它们。 您可以通过在模块的build.gradle中设置sourceSets.main.jniLibs.srcDirs来更改此设置。 您将需要一个带有库的子目录,用于您要定位的每种体系结构(例如x86,arm,mips,arm64-v8a等)。

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

以及该页面上的示例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/'

目前,使用“ 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()]
                    }
                }
            }
        }
    }

    ...
}

在这里,您有个主意:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM