[英]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.