Android-NDK/JNIAndroid技术知识Android知识

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机票,带你领略世界的浩瀚

上一篇下一篇

猜你喜欢

热点阅读