Android JNI之执杖生涯 .a -> .so(gr

作者: 流浪的乌托邦 | 来源:发表于2017-06-16 11:14 被阅读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机票,带你领略世界的浩瀚

    相关文章

      网友评论

        本文标题:Android JNI之执杖生涯 .a -> .so(gr

        本文链接:https://www.haomeiwen.com/subject/gczdqxtx.html