Android Studio v2.3 进行NDK配置和使用

    xiaoxiao2021-03-25  86

    1、概述

    以前在eclipse上玩过NDK,现在想在Android Studio试试NDK,看了网上的一些教程,大多数比较老,步骤过时。本文根据最新android Studio版本进行NDK的配置,并进行基本使用。

    2、环境配置

    (1)安装NDK

    从菜单栏中选择Tools > Android > SDK Manager。点击SDK Tools选项卡。勾选LLDB,CMake和NDK。

    1)The Android Native Development Kit (NDK): 让你能在 Android 上面使用 C 和 C++ 代码的工具集。

    2)CMake: 外部构建工具。如果你准备只使用 ndk-build 的话,可以不使用它。

    3)LLDB: Android Studio 上面调试本地代码的工具。

    等待下载,下载完成后自动配置,无需手工操作,果然亲儿子,的确方便。

    3、创建支持 C/C++ 的新项目

    (1)在Configure your new project选项中,勾选Include C++ Support选项。

    (2)点击 Next,后面的流程和创建普通的 Android studio 工程一样。

    (3)在Customize C++ Support选项卡中

    你有下面几种方式来自定义你的项目:

    C++ Standard:点击下拉框,可以选择标准 C++,或者选择默认 CMake 设置的Toolchain Default选项。

    Exceptions Support:如果你想使用有关 C++ 异常处理的支持,就勾选它。勾选之后,Android Studio 会在 module 层的 build.gradle 文件中的cppFlags中添加-fexcetions标志。

    Runtime Type Information Support:如果你想支持 RTTI,那么就勾选它。勾选之后,Android Studio 会在 module 层的 build.gradle 文件中的cppFlags中添加-frtti标志。

    (4)创建成功

    cpp目录存放你所有 native code 的地方,包括源码,头文件,预编译项目等。对于新项目,Android Studio 创建了一个 C++ 模板文件:native-lib.cpp,并且将该文件放到了你的 app 模块的src/main/cpp/目录下。这份模板代码提供了一个简答的 C++ 函数:stringFromJNI(),该函数返回一个字符串:”Hello from C++”。

    External Build Files目录是存放 CMake 或 ndk-build 构建脚本的地方。有点类似于 build.gradle 文件告诉 Gradle 如何编译你的 APP 一样,CMake 和 ndk-build 也需要一个脚本来告知如何编译你的 native library。对于一个新的项目,Android Studio 创建了一个 CMake 脚本:CMakeLists.txt,并且将其放到了你的 module 的根目录下。

    4、编译运行

    编译运行成功后,在 APP 中显示一段文字”Hello from C++”。

    从编译到运行示例 APP 的流程简单归纳如下:

    1)Gradle 调用外部构建脚本,也就是CMakeLists.txt。

    2)CMake 会根据构建脚本的指令去编译一个 C++ 源文件,也就是native-lib.cpp,并将编译后的产物扔进共享对象库中,并将其命名为libnative-lib.so,然后 Gradle 将其打包到 APK 中。

    3)在运行期间,APP 的 MainActivity 会调用System.loadLibrary()方法,加载 native library。而这个库的原生函数,stringFromJNI(),就可以为 APP 所用了。

    4)MainActivity.onCreate() 方法会调用stringFromJNI(),然后返回 “Hello from C++”,并更新 TextView 的显示。

    注意:Instant Run并不兼容使用了 native code 的项目。Android Studio 会自动禁止Instant Run功能。

    转载请注明原文地址: https://ju.6miu.com/read-21393.html

    最新回复(0)