[时间:2017-07] [状态:Open]
[关键词:Android,Android Studio,gradle,native,c,c++,cmake,原生开发]

0 引言

最近在工作中遇到了升级Android Studio 2.3.3稳定版之后,无法编译jar包的问题。之后寻找AS文档-探索 Android Studio发现。可以通过AS创建和编译jar包,顺便看到支持原生开发,可以直接在AS中调试c/c++代码,这是非常不错的功能。终于可以摆脱纯打日志的开发环境了。

本系列文章也就因此而出现。我希望阅读文本文之后,大家能够基本了解如何使用新版的Android Studio开发原生引用。
这里说明一点,本文是参考谷歌的Android Studio官网来的,也可以认为是一种翻译版。可以访问的话你可以直接查看对应内容。

1 环境准备

注意搭配使用 Android Studio 2.2 或更高版本与 Android Plugin for Gradle 版本 2.2.0 或更高版本时,您可以将 C 和 C++ 代码编译到 Gradle 与 APK 一起打包的原生库中,将这类代码添加到您的应用中。您的 Java 代码随后可以通过 Java 原生接口 (JNI) 调用您的原生库中的函数。

Android Studio 用于构建原生库的默认工具是 CMake。由于很多现有项目都使用构建工具包编译其原生代码,Android Studio 还支持 ndk-build。不过,如果是在创建新的原生库,则应使用 CMake。

原生应用的编译和调试需要依赖于NDK和构建工具,如下:

  • Android 原生开发工具包 (NDK):这套工具集允许你在Android上使用C/C++代码,并提供平台库,让你可以管理原生Activity和访问物理设备组件,例如传感器和触摸输入。
  • CMake:一款外部构建工具,可与Gradle搭配使用来构建原生库。如果你只准备使用ndk-build,则不需要此组件。
  • LLDB:Android Studio使用的用于调试原生代码的调试器。

你可以使用SDK Manager来安装这些组件。在Android Studio中打开SDK Manager并切换到SDK Tools的标签页,如下图所示

选择需要安装的组件,安装即可。

2 工程创建

创建原生工程和其他工程类似,在菜单File->New->New Project点击出来的新工程配置对话框中勾选Include C++ Support复选框。如下图:

这样在工程配置的最后可能多出几个选项。(我使用的是Basic Activity)。

在配置向导的自定义C++支持部分,你可以配置以下选项:(如下图)

  • C++ Standard: 使用下拉列表框选择你使用的C++标准。默认使用CMake配置的工具链,也可以选择c++11。
  • Exceptions Support: 如果你希望c++支持异常处理,勾选该复选框。如果使能的话,Android Studio将把-fexceptions标志添加到你的模块构建的build.gradle文件中的cppFlags中,这最终会传递给CMake。
  • Runtime Type Information Support(运行时信息支持):如果你希望支持RTTI,勾选该复选框。如果使能,Android Studio将把-frtti标志添加到模块构建的build.gradle文件中的cppFlags,并最终传递给CMake。

这样Android Studio会自动创建一个支持JNI的原生应用。打开工程,切换到Android视图,截图如下:

上图可以看到Android Studio自动添加了cpp组和External Build Files组。
在cpp组中你可以找到所有属于当前工程的native源代码、头文件和构建的库。对于新的工程,Android Studio会创建一个示例的C++源文件native-lib.cpp,它被存放在src/main/cpp/目录下。该示例代码提供了简单的C++函数stringFromJNI(),该函数会返回一个字符串“Hello from C++”。后续部分会介绍如何添加新的native源文件。

在External Build Files组中你可以找到CMake或ndk-build所需的构建脚本。和build.gradle文件在构建app是功能类似,CMake和ndk-build需要构建脚本来协助构建原生库。对于新的工程,Android Studio会自动创建一个CMake构建脚本 CMakeLists.txt,并存放在你的模块根目录。

3 构建测试和验证

通过第二节的介绍之后我们可以编译运行,看看执行效果了。实际上,Android Studio将构建和加载一个直接显示“Hello from C++”的app。
为了构建和运行示例app,需要经过以下事件处理逻辑:

  1. Gradle调用你的外部构建脚本CMakeLists.txt。
  2. CMake按照构建本中的命令构建C++源文件native-lib.cpp,便以为共享库,并命名为libnative-lib.so,之后Gradle会将其打包到APK中。
  3. 在运行时,app的MainActivity将通过System.loadLibrary()加载原生库。这样原生函数 stringFromJNI() 就可以在app中访问了。
  4. MainActivity.onCreate()将会调用stringFromJNI()函数,并将其返回值更新到TextView中。

而且你可以在stringFromJNI()添加断点,调试看到对应的字符串值。

你也可以通过APK Analyzer分析Gradle有没有将原生库放到APK安装包中,步骤如下:

  1. 菜单中选择Build > Analyze APK.
  2. app/build/outputs/apk/目录下选择apk,并点击确定。
  3. 如下图所示,libnative-lib.so被放置到lib目录下。

4 小结及后续

本文作为Android创建的第一篇内容,整体比较简单,这里并未详细介绍代码和gradle、CMake构建脚本。这只是第一步,接下来我们可能需要尝试了解如何添加新的源文件、如何编写CMake的构建脚本、如何在Gradle中关联native库、如何使用ndkbuild构建原生应用等等。

Android Studio原生库创建示例的更多相关文章

  1. android studio依赖库工程Activity显示问题及库工程设置

    android studio引用库工程其实不难,直接添加依赖module即可,但是我在操作过程中出现一些奇怪的问题,苦扰我一整天,为了祭奠这苦命的一天特别mark一下. 首先描述一下我的错误现象: s ...

  2. IDEA插件(Android Studio插件)开发示例代码及bug解决

    IDEA插件(Android Studio插件)开发示例代码及bug解决 代码在actionPerformed方法中,有个AnActionEvent e 插件开发就是要求我们复写上述的这个方法即可,在 ...

  3. Android Studio使用百度地图示例BaiduMapsApiASDemo

    Android Studio使用百度地图示例BaiduMapsApiASDemo 用自己AVD下的debug.keystore替换掉项目中的debug.keystore 生成自己的签名 同样的方法生成 ...

  4. 使用 Android Studio 开发工具创建一个 Android 应用程序,显示一行文字“Hello Android”,并将应用程序的名称更改为“FirstApp”。

    需求说明: 使用 Android Studio 开发工具创建一个 Android 应用程序,显示一行文字"Hello Android",并将应用程序的名称更改为"Firs ...

  5. 使用 Android Studio 开发工具创建一个 Android 应用程序,并在 Genymotion 模拟器上运行

    需求说明: 使用 Android Studio 开发工具创建一个 Android 应用程序,并在 Genymotion 模拟器上运行 实现步骤: 打开 Android Studio,创建一个 Andr ...

  6. android studio学习----如何创建一个库项目

    首先,打开Android studio的软件工具,进入到界面中点击菜单的“file”选项. 2 在弹出的下拉的菜单中,可以看到的是为"New Module“的选项点击进入.   3 进入到c ...

  7. Android Studio提交库至Bintray jCenter从入门到放弃

    文:http://blog.csdn.net/sk719887916/article/details/52473914 作者:Tamic 详细文章请看:[Gradle系列]Gradle发布module ...

  8. Android Studio体验(二)--创建项目和Genymotion试用

    上周日已经体验了一把Android Studio顺便没事点了点其他功能,不过还是从自己创建项目开始说吧,首先我们要熟悉Android Studio中的Project 和 Module 两个概念.And ...

  9. android -------- android studio 中设置创建类时的说明信息(包含 作者 ,创建时间,注释说明等)

    今天简单来说一下android studio开发工具中的 一个小设置功能: 在开发过程中我们习惯给新建的类添加一些注释信息,创建日期.时间和作者等. 设置信息 File—>Settings—&g ...

随机推荐

  1. Mybatis insert时返回自增id

    SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题,他可以很随意的设置生成主键的方式. 详细看这里:http://www.cnblogs.com/SimonHu1 ...

  2. vscode下Python设置参考

    用于VS代码的Python扩展是高度可配置的.此页面介绍了可以使用的关键设置. 请参阅用户和工作区设置,以了解有关在VS代码中使用设置的更多信息. 常规设置 设置 默认 描述 python.pytho ...

  3. HDU 1159 Common Subsequence 【最长公共子序列】模板题

    题目链接:https://vjudge.net/contest/124428#problem/A 题目大意:给出两个字符串,求其最长公共子序列的长度. 最长公共子序列算法详解:https://blog ...

  4. 使用MSF发现主机和端口扫描

    使用MSF发现主机和端口扫描 使用search命令查找需要的模块 MSF模块太多,记不住怎么办!!! 我们不需要记住所有模块,我们只要能找到我们想用的模块就行,平时积累使用的模块也行哦! 比如,我们通 ...

  5. Python常用模块--string

    该模块提供3个常用的功能: * 提供常用的字符串常量(感觉用途不大) * 提供字符串替换功能,主要用途是上下文的国际化(通过str可以实现,不介绍,感兴趣的自己看官网) * 提供字符串的格式化功能(感 ...

  6. 树莓派(Raspbian系统)中使用pyinstaller封装Python代码为可执行程序

    一.前言 将做好的Python软件运行在树莓派上时,不想公开源码,就需要对文件进行封装(或称打包),本文主要介绍使用pyinstaller封装Python代码为可执行程序. Python是一个脚本语言 ...

  7. js基础梳理-究竟什么是变量对象,什么是活动对象?

    首先,回顾下上篇博文中js基础梳理-究竟什么是执行上下文栈(执行栈),执行上下文(可执行代码)?的执行上下文的生命周期: 3.执行上下文的生命周期 3.1 创建阶段 生成变量对象(Variable o ...

  8. Java并发程序设计(十三)锁的性能优化

    锁的性能优化 一.优化注意事件 一)减少锁的持有时间 只在必要时进行同步,能明显减少锁的持有时间. 二)锁的细化 缺陷:当系统需要全局锁时,其消耗的资源会比较多. 三)锁的分离 比如读写分离锁 四)锁 ...

  9. angular.js--demo2-----声明局部控制器controller

    <!doctype html><html ng-app="HelloAngular"> <head> <meta charset=&quo ...

  10. rabbitmq使用(三)

    Publish/Subscribe In the previous tutorial we created a work queue. The assumption behind a work que ...