[英]How to build external C++ library with Android Studio + Gradle + NDK?
[英]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.