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
即可:
点击运行即可看到效果:
向现有项目添加 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
为例。
创建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
。
或者手动配置:
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
评论 (0)