上述答案是解决gradle之前不足的NDK集成的方法。这个答案说明了新的gradle集成NDK的方法。
请查看针对gradle 2.9和android插件0.6.0-alpha1编写的
示例。与问题提出的方式相反,此答案包含一个用于库的独立项目。可以探索此功能,以允许gradle在应用程序项目使用库之前构建该库。其他答案依赖于已经构建了库的假设。
:secondlib
com.android.model.application
构建libsecondlib.so(在Java代码中使用System.loadLibrary("secondlib")加载)。名称'secondlib'命名不当。我认为它是所有其他链接用于应用程序使用的本地库的“.so包装器”。
该共享库静态链接到由:firstlib
com.android.model.native
构建的firstlib.a。
头文件按照
exportedHeaders
子句从:firstlib导出到任何依赖项目(:secondlib在此示例中)。这样依赖项目就知道如何链接.so/.a。这取代了先前答案中的CFlags+="-I/path/to/headers"语法。
:secondlib根据以下子句静态链接到:firstlib:
android.sources {
main {
jni {
dependencies {
project ":firstlib" buildType "debug" linkage "static"
}
}
}
}
如评论所示,该示例不完整。完成语法在
实验性Android插件文档的“NDK Dependencies”部分中显示。在该文档中,静态链接而非动态链接的语法应该很清楚。
目前存在一些缺点(例如,上面显示的依赖项的buildType默认为“debug”,而不是当前正在构建的buildType)。
编辑:这里是我其中一个项目中提取出来的app/build.gradle中新依赖项语法的进展样本。
android.sources {
main {
jni {
dependencies { project ":libfoo" linkage "shared" }
}
jniLibs {
source { srcDirs 'libs' }
dependencies { library "libfoo" }
}
}
}
repositories {
libs(PrebuiltLibraries) {
libevdev {
binaries.withType(SharedLibraryBinary) {
sharedLibraryFile = file("../libfoo/build/intermediates/binaries/debug/lib/${targetPlatform.getName()}/libfoo.so")
}
}
}
}