簡體   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