Android JNI之执杖生涯 .a -> .so(gr
2017-06-16 本文已影响84人
流浪的乌托邦
连载
又见一帘幽梦,jni .a的故事还在继续。原本打算跟 mk方式 一起,名字都想好了,大道三千,我只取二瓢。燃,故事开始。
gradle-experimental
故事的猪脚。一个插件,专门为 JNI 服务。E文好的同学,大体也猜出来了,这个是谷狗实验室里边的玩意。东西,是好东西,就是实验二字,呵呵呵呵。纯粹的gradle方式,取代mk,构建一体化,梦想是美好的。但,但谷歌似乎没怎么放心上。闲话不多说,欲修炼此功,需注意几点。
注1. 项目 gradle 依赖
对于 gradle-experimental, 我是满头欣喜的。一体化,纯粹的gradle,让我不得不欣赏。一见钟情,再而衰,三而竭。手起刀落,一个配置的更换,让我走上了渡劫之路。配置如下:
buildscript {
...
dependencies {
/**
* 从前 classpath 'com.android.tools.build:gradle:2.2.3'
* 由于插件的更换,蝴蝶来到了太平洋,一系列随之而来
*/
classpath 'com.android.tools.build:gradle-experimental:0.9.3'
}
}
注2. 当前app module配置
自己的决定,站起来就是撸。app module,作为渡劫场所,紧张刺激的准备工作马上就要开始了。你看:
app应用插件调整,
//从前, apply plugin: 'com.android.application'
apply plugin: 'com.android.model.application'
由于加持了 model 插件, 渡劫被限制在作用域 model 中,气场就是不一样, 稳了。见识见识:
model{
...
android{
}
}
渡劫,要有渡劫的样子,以前的配置,自然得有个小增强。瞧,几颗栗子:
model{
...
android{
...
defaultConfig {
···
//从前车马慢,minSdkVersion 19
minSdkVersion.apiLevel 9
targetSdkVersion.apiLevel 19
}
}
}
注3. 核心配置
渡劫路上,需要依赖于.a静态库,成就so。首先定义对于库的repositories,用来指定库的基本信息,包括库文件的路径,头文件的路径以及链接的方式等,详见如下代码:
model {
...
repositories {
libs(PrebuiltLibraries) {
libHello {
// 头文件地址
headers.srcDir "src/main/jni/sources/"
// 静态链接库的引用,
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("src/main/jni/sources/${targetPlatform.getName()}/libHello.a")
}
}
}
}
}
渡劫,成功的关键 —— NDK 配置,然后gradle一下,渡劫开始。NDK配置已经多有熟悉,但这里又有少许区别 。详情吐下:
model{
...
android{
...
ndk {
moduleName "JniDemo"
//书信很远, cppFlags "-std=c++11"
cppFlags.add("-std=c++11") //c++版本
stl "gnustl_static" //支持 stl 标准库
// 配置可多个, abiFilters "armeabi", "armeabi-v7a", "x86"
// abiFilters.addAll(['armeabi', 'armeabi-v7a', 'x86'])
}
}
}
结语
到这,已经在渡劫路上越走越远了。对于 mk, gradle-experimental,本来想做个对比的。后面想想,各有千秋,都是基于 NDK build。至于选择如何,暂且不提,各有所好罢了。期待下一次的相遇,下一次的精彩。
附送一张github机票,带你领略世界的浩瀚