我有一个Android项目,它将一堆资源链接到一个单一的JNI库中。我想将这个单独的库拆分成多个较小的库,它们之间有一些依赖关系。如何使用新的gradle构建系统实现这一目标?
答案 0 :(得分:1)
您可以使用experimental gradle plugin family中的独立Android原生插件实现此目的。新插件基于gradle component approach towards modeling builds。有many advantages to using the new system。
例如:
root
+ lib -> 'com.android.model.native'
+ lub -> 'com.android.model.native'
+ aar -> 'com.android.model.library'
+ app -> 'com.android.model.application'
<强>的build.gradle 强>
configure([project(':lib'), project(':lub'), project(':aar'), project(':app')]) {
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle-experimental:0.6.0-alpha5'
}
}
}
<强> LIB /的build.gradle 强>
apply plugin: "com.android.model.native"
model {
android {
compileSdkVersion 23
ndk {
moduleName "foo"
}
sources {
main {
jni {
exportedHeaders {
srcDir "src/main/headers"
}
}
}
}
}
<强>滑油/的build.gradle 强>
apply plugin: "com.android.model.native"
model {
android {
compileSdkVersion 23
ndk {
moduleName "bar"
}
sources {
main {
jni {
exportedHeaders {
srcDir "include"
}
}
}
}
}
<强> AAR /的build.gradle 强>
apply plugin: "com.android.model.library"
model {
android {
buildToolsVersion '23.0.2'
compileSdkVersion 23
ndk {
moduleName "aggregate-jni"
stl "stlport_shared" // using cpp?
}
sources {
main {
jni {
dependencies {
project ":lib"
project ":lub"
}
}
}
}
}
应用/的build.gradle 强>
apply plugin: 'com.android.model.application'
model {
android {
buildToolsVersion '23.0.2'
compileSdkVersion 23
defaultConfig {
applicationId "com.example.app"
minSdkVersion.apiLevel 21
targetSdkVersion.apiLevel 23
versionCode 1
versionName "1.0"
}
}
}
dependencies {
compile project(':aar')
}
如果链接是动态的(默认为ndk),则aar将包含:
libfoo.so libbar.so libaggregate-jni.so libstlport.so
和你的镜像java类。你可以简单地
System.load("aggregate-jni");
你的java类中的和引用的库也会加载。如果链接是静态的,那么无论如何你都会得到一个libaggregate-jni.so
。请注意,按照end up with multiple copies of the stl in your binary将静态链接到stl是很糟糕的。这真的搞砸了。
请注意默认gcc
toolchain is now deprecated。最好使用:
model {
android {
ndk {
toolchain 'clang'
stl 'c++_shared'
}
}
}
最后,你绝对不需要aar,我只是为了完整而包含它。应用程序项目可以直接依赖于独立的本机lib项目,因为应用程序插件也完全支持ndk。