我想在我的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'
}
}
答案 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"])
}