Android NDK 开发入门

Author Avatar
wshunli 1月 19, 2018
  • 在其它设备中阅读本文章

Android NDK 是一套允许您使用原生代码语言(例如 C 和 C++)实现部分应用的工具集。在开发某些类型应用时,这有助于您重复使用以这些语言编写的代码库。

那我们为什么要使用 NDK 呢?

  • 代码的保护。由于 apk 的 Java 层代码很容易被反编译,而 C/C++ 库反汇难度较大。
  • 可以方便地使用现存的开源库。大部分现存的开源库都是 用C/C++ 代码编写的。
  • 提高程序的执行效率。将要求高性能的应用逻辑使用 C 开发,从而提高应用程序的执行效率。
  • 便于移植。用 C/C++ 写得库可以方便在其他的嵌入式平台上再次使用。

上述文字致谢 Devin Zhang 提供理论支持

本文默认已配置好 Android 开发环境,
关于 Android 开发环境配置可参考:http://www.wshunli.com/posts/f6977dbb.html

NDK 环境配置

1、首先应该下载 NDK

官方指定的下载地址:https://developer.android.google.cn/ndk/downloads/index.html

可能因为网络原因打不开,而且我们也不要那么新的。

本文以 Android NDK r10e 版本为例:

下载地址:https://dl.google.com/android/repository/android-ndk-r10e-windows-x86_64.zip

下载好之后,解压即可,我们解压到:D:\Android\android-ndk-r10e

2、和配置 Android 环境类似,配置 NDK 环境

新建变量:ANDROID_NDK

D:\Android\android-ndk-r10e

Path 中添加

%ANDROID_NDK%

3、验证 NDK 环境

在 命令控制符 中输入 ndk-build -version 存在输出即可。

第一个 Android NDK 项目

在 Android Studio 中新建 Android NDK 项目特别简单,

只需在新建项目时,勾选 include C++ support 即可:

1.新建NDK项目.png

点击运行即可看到效果:

1.Screenshot_1516414188.png

向现有项目添加 C/C++ 代码

如果您希望向现有项目添加原生代码,请执行以下步骤:

1、创建新的原生源文件并将其添加到您的 Android Studio 项目中。

如果您已经拥有原生代码或想要导入预构建的原生库,则可以跳过此步骤。

2、创建 CMake 构建脚本,将您的原生源代码构建到库中。如果导入和关联预构建库或平台库,您也需要此构建脚本。

如果您的现有原生库已经拥有 CMakeLists.txt 构建脚本或者使用 ndk-build 并包含 Android.mk 构建脚本,则可以跳过此步骤。

3、提供一个指向您的 CMake 或 ndk-build 脚本文件的路径,将 Gradle 关联到您的原生库。Gradle 使用构建脚本将源代码导入您的 Android Studio 项目并将原生库(SO 文件)打包到 APK 中。

创建新的原生源文件

1、选择 Project 视图,在 main 目录下,新建 cpp 文件夹;

2、在 cpp 文件夹下新建 C/C++ Source File ,本文以 native-lib 为例。

1.创建新的原生源文件.png

创建CMake构建脚本

CMake 构建脚本是一个纯文本文件,您必须将其命名为 CMakeLists.txt。

在 Android 视图下,在 app 模块下右键,新建 File,文件名为 CMakeLists.txt

文件内容如下:

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library.

cmake_minimum_required(VERSION 3.4.1)

# 指示 CMake 从原生源代码创建一个原生库
add_library( # Sets the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/cpp/native-lib.cpp )
# 添加引用 NDK 库
find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )
# 关联 NDK 库
target_link_libraries( # Specifies the target library.
                       native-lib

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

将Gradle关联到您的原生库

在 Android 视图下,右键点击您想要关联到原生库的模块(例如 app 模块),并从菜单中选择 Link C++ Project with Gradle

1.将Gradle关联到您的原生库.png

或者手动配置:

android {
  ...
  defaultConfig {...}
  buildTypes {...}

  // Encapsulates your external native build configurations.
  externalNativeBuild {
    // Encapsulates your CMake build configurations.
    cmake {
      // Provides a relative path to your CMake build script.
      path "CMakeLists.txt"
    }
  }
}

可选配置,可以包裹一些特定的示例代码:

android {
    compileSdkVersion 26
    defaultConfig {
        ···
        externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions"
            }
        }
        ndk {
            // Specifies the ABI configurations of your native
            // libraries Gradle should build and package with your APK.
            abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a'
        }
    }

最后运行即可,效果是一样的。

添加 native 方法流程

MainActivity 中添加 native 方法:

    public native void printLog();

native-lib.cpp 中添加头文件及宏定义

#include <android/log.h>

#define TAG "native-lib"
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)

实现 native 方法,我们这里打印个日志:

extern "C"
JNIEXPORT void JNICALL
Java_com_wshunli_android_ndk_demo_MainActivity_printLog(JNIEnv *env, jobject instance) {
    LOGV("log from native");
}

这个方法可以自动生成,在 native 方法下 Alt + Enter 即可。

本文源码:https://github.com/wshunli/android-ndk-demo

参考资料
1、Android NDK | Android Developers
https://developer.android.com/ndk/index.html
2、Android-NDK入门-慕课网
https://www.imooc.com/learn/411
3、Android-NDK进阶-慕课网
https://www.imooc.com/learn/918
4、Android NDK开发(一) 入门 - 简书
https://www.jianshu.com/p/0261e6cceb3e
5、向您的项目添加 C 和 C++ 代码 | Android Studio
https://developer.android.com/studio/projects/add-native-code.html?hl=zh-cn

如果本文对您有所帮助,且您手头还很宽裕,欢迎打赏赞助我,以支付网站服务器和域名费用。 https://paypal.me/wshunli 您的鼓励与支持是我更新的最大动力,我会铭记于心,倾于博客。
本文链接:https://www.wshunli.com/posts/3eae2406.html