在新版的AS预览版中我发现对于NDK的支持有所变化。
在新的插件版本中加强了对NDK的支持以及性能的优化。
于是查询了一下文档,特此写了该文章,为尝鲜的朋友准备,喜欢尝鲜的朋友可以试试,个人感觉味道不错。
在之前版本的时候我写过如何在AS中编译NDK:
[Android] 环境配置之Android Studio开发NDK

本篇文章是一篇半翻译文章,来源于AS的说明文档,在文章底部会附上原文链接。
本篇文章中的东西来源于预览版,本文章中的方法已测试有效;但不建议用于生产开发。

介绍

这是一个新的试验性插件,该组建基于新的Gradle组建模型;在配置上能显著减少时间。在新的插件中包括了使用JNI开发NDK的一键式操作。在本指南中提供了详细的使用方式,同时强调了新的插件与原始插件之间的区别。

警告:该插件是试验性插件。有关该插件的Gradle API也并不是最终版本。这意味着他只是特定版本的API,也可能只能在特定版本中使用。

此外。DSL可能发生大量改变,在最终版本中有可能采用新的API代替。

该实验插件是改善了NDK集成与性能相关的早期预览版本(这两个问题来自于用户反馈)。

需求

  • Gradle 2.5 (仅仅)
  • Android NDK R10e 版本(如果你需要使用NDK)
  • SDK 构建工具最低版本 19.0.0 ,一些功能可能需要更新的版本
  • AS 1.3 预览版及其更高版本

迁移

从之前版本迁移到最新预览版。在下面显示了新的预览版的项目结构,更改的地方使用红色表示。

./gradle/wrapper/gradle-wrapper.properties

新的插件仅仅只支持 gradle-2.5.

#Wed Apr 10 15:27:10 PDT 2013
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https://services.gradle.org/distributions/gradle-2.5-all.zip

./build.gradle

其中Classpath 应该配置为 com.android.tools.build:gradle-experimental 以前是 com.android.tools.build:gradle
当前可使用版本为: 0.2.0.

// 提示: 顶层配置,你也可以在你的子项目或者子Model中添加对应配置buildscript {repositories {jcenter()}dependencies {classpath 'com.android.tools.build:gradle-experimental:0.2.0'// 提示: 别把项目所需依赖写在这里,他们属于Model中的 build.gradle 文件}
}allprojects {repositories {jcenter()}
}

./app/build.gradle

在该插件中有着许多有关DSL变化。其中很多变化似乎有些奇葩,并不必要;因为在我看来插件变化应该尽量简单以减少插件迁移的代价。

DSL 变更:

  • Apply 默认插件名现在是 com.android.model.application 在之前的版本中是:com.android.application. 如果我们的Model是另外的库或者aar 那么现在应该为: com.android.model.library
  • 根配置应该加上 model { } 模块
  • 大多属性应该加上 '=' 操作符
  • 如果是为集合添加对应的元素应该使用 '+=' 操作符

使得 DSL 更局限性的变更:

  • buildTypes, productFlavors 和 signingConfigs 配置必须写在 android { } 模块以外
  • 能在 android { } 模块中嵌套使用的配置需要加上with 关键字.
  • 属性也将只能使用所支持的直接属性,而没法使用其他类型而后进行转换(如果该属性是int类型,将只能输入int值,而不能是string字符然后强制转换)。例如:
    • 文件类型属性将直接接受文件类型,而不接受String类型。
    • 不能直接使用 minSdkVersion 接受一个 int 或者 string 类型,而需要写为:minSdkVersion.apiLevel = 15.
  • 创建一个buildType 或者 productFlavor 等标记需要调用 create方法. 修改一个现有的,如buildType中的release或者debug标记可以直接使用名称就可以了.
  • 现在修改DSL 的变量或者任务是非常非常局限的.
dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])compile 'com.android.support:appcompat-v7:22.2.0'
}

NDK 相关

在该实验插件中使用NDK创建Android本地程序。 你需要:
使用下载工具下载 NDK 包并配置好环境.
在项目local.properties 文件中设置 ndk.dir 变量并指定你的 NDK 路径,也可以在环境变量中设置 ANDROID_NDK_HOME 为你计算机上的 NDK 路径.
在你的 model 中的 build.gradle 文件中添加 android.ndk 板块.

已知局限

  • 不支持NDK-only模块;仅仅支持混合的app或者lib库的项目编译。
  • 编译项目时并不会重复编译已编译完成的JNI代码(AAR库中的所有so文件仅仅只是简单打包到APK中,不会进行重复编译)。
  • 不支持创建可依赖静态库。
  • 不支持使用诸如cpu_features 的NDK库。
  • 不支持集成外部构建系统。

Model 中的 build.gradle 中的 NDK 配置诸如这样:

提示:项目中的 moduleName 属性是必须的,它定义了 NDK 所生成的文件名。

默认情况下,JNI 文件应该放到项目的目录为:src/main/jni ,在其中你可以放C/C++代码;当然你也可以重新定义该默认目录。

model {android {compileSdkVersion = 22buildToolsVersion = "22.0.1"}android.ndk {moduleName = "native"}android.sources {main {jni {source {srcDir 'src'}}}}
}

其他的编译属性你可以设置到android.ndk { } 模块中,诸如:

model {android {compileSdkVersion = 22buildToolsVersion = "22.0.1"}android.ndk {// 所有可以在 android.ndk 中定义的配置.moduleName = "native"toolchain = "clang"toolchainVersion = "3.5"// 提示:CFlags 是一个C的资源, 其命名与常规的属性并不一样.  这是一个技术限制,但在以后会解决。CFlags += "-DCUSTOM_DEFINE"cppFlags += "-DCUSTOM_DEFINE"ldFlags += "-L/custom/lib/path"ldLibs += "log"stl = "stlport_static"}android.buildTypes {release {ndk.with {debuggable = true}}}android.productFlavors {create("arm") {ndk.with {// 你可以在 productFlavors 和 buildTypes 节点中配置 NDK 相关的属性abiFilters += "armeabi-v7a"}}create("fat") {// 如果未指定 ndk.abiFilters 属性,那么将会生成所有的CPU版本ABI.}}// 你可以修改所有的 NDK 属性components.android {binaries.afterEach { binary ->binary.mergedNdkConfig.cppFlags.add("-DVARIANT=\"" + binary.name + "\"")}}
}

原文链接

需要梯子:
http://tools.android.com/tech-docs/new-build-system/gradle-experimental

案例

这里有一些Google官方的案例,地址:
https://github.com/googlesamples/android-ndk.
我的博客中的案例会放到:
https://github.com/qiujuer/BeFoot

========================================================
作者:qiujuer
博客:blog.csdn.net/qiujuer
网站:www.qiujuer.net
开源库:github.com/qiujuer/Genius-Android
开源库:github.com/qiujuer/Blink
转载请注明出处:http://blog.csdn.net/qiujuer/article/details/47961763
—— 学之开源,用于开源;初学者的心态,与君共勉!

========================================================

AS1.3 及其以上预览版新插件-实验版(NDK)相关推荐

  1. 帆软报表获取单元格的值的几种方式,包括分页预览,填报预览,新填报预览

    帆软报表获取单元格的值的方式在分页预览,填报预览,新填报预览都是不同的,没有统一的方式,这给使用者带来一定的不便.现在总结一下. 分页预览: getCellValue: function (cellP ...

  2. pdfh5.js 基于pdf.js和jQuery,web/h5/移动端PDF预览手势缩放插件。

    pdfh5.js 基于pdf.js和jQuery,web/h5/移动端PDF预览手势缩放插件. 注意:本地绝对路径地址不能加载,跨域问题用代理或者服务端解决. svg模式渲染存在缺陷,只能渲染普通pd ...

  3. VUE图片预览放大缩小插件viewer

    VUE图片预览放大缩小插件viewer 一.安装依赖 npm install v-viewer --save 二.main.js内引用并注册调用 //main.js import Viewer fro ...

  4. 360度商品展示html5,360度图片旋转产品预览展示js插件

    这是一款360度图片旋转产品预览展示js插件.该360度图片旋转产品预览js插件提供多种控制产品图片旋转的方法,包括自动旋转,通过按钮来控制旋转,通过鼠标拖拽或鼠标移动来控制旋转,通过鼠标滚轮来控制旋 ...

  5. html制作手机预览效果,新移动端Html5方式预览报表插件

    2. Html5报表制作及手机效果 2.1 手机页面大小 制作手机上的报表与PC端报表制作过程是一样的,为了让用户制作出适合手机尺寸的报表,在模板>>移动端属性地方,勾选设置为手机模板画布 ...

  6. 不同手机型号图文预览_分分钟教你使用手机预览原型图(MAC版)

    在网上看了很多人都使用EasyWebSvr做一个本地服务器,然后将做好的原型文件装进去,手机打开浏览器就可以预览原型图啦~ 但是MAC系统没有EasyWebSvr怎么办? 不用担心,很简单~ 步骤 设 ...

  7. 微信小程序点击图片放大预览,新页面中全屏预览图片

    第一步:在wxml中定义image组件,并设置绑定事件. <image src="{{priceUrl}}" bindtap="imgClick"> ...

  8. office(doc,xls,txt,pdf,ppt)文档在线预览及转换(office2pdf) - PHP版

    最近项目想用到"文档在线预览",参考了一下 使用OpenOffice.org将各类文档转为PDF 本想用OpenOffice的类, 但OpenOffice的类太复杂了.. 后来想到 ...

  9. 【VUE】图片预览放大缩小插件(推荐阅读)

    From: https://www.jianshu.com/p/e3350aa1b0d0 在看项目时,突然看到预览图片的弹窗,感觉好僵硬,不能放大,不能切换,于是便在网上找下关于图片预览的插件,有找到 ...

  10. 图片上传本地预览(回显)插件

    图片上传本地预览插件,本示例只是静态页面,请下载完整的示例查看 请下载完整的js和css样式,以及Demo <html><title>文件上传</title>< ...

最新文章

  1. 逆元~(乘法逆元及其应用)
  2. Android 中intent传递序列化信息(传递类)
  3. windows10怎么安装python第三方库_怎么在windows下安装python第三方包
  4. uniapp返回上一页_一例万级写入并发,百亿级数据,毫秒级返回架构分享
  5. Symbol MC1000 扫描 冲突问题 把下面文件做成scanwedge.reg的注册表文件,放在Application重起
  6. 1m带宽可以做mysql数据库吗_服务器的1M带宽够用吗?1M网速是多少?
  7. Spring Boot 中文索引--资料大全
  8. omnigraffle 画曲线_「技法」三步学会用绘图利器 OmniGraffle 绘制流程图
  9. GridView常用代码 (转)
  10. BroadcastReceiver 用于接收广播
  11. React Native系列文章
  12. Introduce Local Extension
  13. MYSQL 8.0 OCP
  14. svm公式推导及理解
  15. Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
  16. (译)理解ConstraintLayout性能上的好处
  17. windows10 原版 纯净版 下载
  18. 了解WEB前端开发吗,风风雨雨30年,前端开发变迁史
  19. Vue 防抖节流 详细介绍(面试常客、去繁从简、性能优化)
  20. u8查找文件服务器的数据,u8数据库服务器名怎么查找

热门文章

  1. 基础集合论 第二章 9 族
  2. java添加录音,大家说说java程序里怎么插入视频和音频啊
  3. 复旦nlp实验室 nlp-beginner 任务二:基于深度学习的文本分类
  4. 联合索引(a,b,c),怎么单独检索b用上索引
  5. html自动旋转屏幕,求教!HTML5屏幕旋转90度再让画布自适应,该如何做,大神给留demo...
  6. c语言编写面条排序算法,腾讯PCG事业部腾讯视频面经
  7. java 接口 同名方法_java 实现多个接口 方法重名的解决办法——内部类
  8. 使用CefSharp在.NET中嵌入Google kernel
  9. Jenkins集群搭建
  10. [Selenium+Java] Selenium Framework: Keyword Driven Hybrid