zoukankan      html  css  js  c++  java
  • Android Studio原生库创建示例

    [时间: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的标签页,如下图所示

    as-ndk-tool-install_2.3

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

    2 工程创建

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

    这样在工程配置的最后可能多出几个选项。(我使用的是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。
      3-new-project-c++-wizard

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

    上图可以看到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目录下。
      5-cpplib-apk-analyzer

    4 小结及后续

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

  • 相关阅读:
    hdoj2187:悼念512汶川大地震遇难同胞 (贪心)
    2.0其它之Transform详解,以及UIElement和FrameworkElement的常用属性
    2.0外观之样式, 模板, 视觉状态和视觉状态管理器
    2.0图形之Ellipse, Line, Path, Polygon, Polyline, Rectangle
    2.0控件之ListBox, MediaElement, MultiScaleImage, PasswordBox, ProgressBar, RadioButton
    2.0画笔之SolidColorBrush, ImageBrush, VideoBrush, LinearGradientBrush, RadialGradientBrush
    2.0图形之基类System.Windows.Shapes.Shape
    2.0交互之鼠标事件和键盘事件
    2.0控件之ScrollViewer, Slider, StackPanel, TabControl, TextBlock, TextBox, ToggleButton
    2.0交互之InkPresenter(涂鸦板)
  • 原文地址:https://www.cnblogs.com/tocy/p/Android-studio-native-dev-1-intro.html
Copyright © 2011-2022 走看看