NDK介绍
NDK(Native Development Kit)原生开发套件,由google推出,作用是让开发者能够在android应用中使用C和C++代码,而且NDK提供了众多平台库,开发者可以使用这些平台库管理原生acitvity和访问实体设备组件(比如传感器,触控输入等)。NDK对于大多数初学android开发的有些难度,但是对于要进阶的开发者,那么NDK就大有用途了:
-
进一步提升设备性能,降低延迟或者运行游戏或者物理模拟等计算密集型应用。
-
重复使用开发者自己或者其他开发者开发C或者C++库。
作为Java-based SDK的补充,NDK提供交叉编译器,自动化打包工具以及系统库接口。支持将原生代码库(.so)整合到APK文件中,并且允许直接调用摄像头、传感器等底层硬件资源。
NDK包括编译工具链和预设脚本,简化跨平台编译流程,支持libc、数学库、JNI接口等基础API,同时提供了两种构建方式(ndk-build与CMake)以及多ABI架构适配。开发者可以通过JNI实现JAVA与原生代码交互。
说到这里,有人可能疑惑了,什么是JNI,JNI和NDK又有什么区别,那么接下来就简单介绍一下JNI。
JNI介绍
定义:Java Native Interface,即Java本地接口
作用:可以使Java与本地其他类型语言(C、C++)交互(就是Java代码中调用C、C++等语言的代码 或者 C、C++等代码调用Java 代码)
需要注意:
- JNI是java调用Native语言的一种特性
- JNI是属于Java的,与Android没有直接关系
为什么会有JNI呢
在实际使用的过程中,JAVA需要与本地代码进行交互
而Java作为一种跨平台的语言,其与本地代码交互的能力比较弱
所以为了提高Java与本地代码交互的能力,采用JNI的特性成为解决该问题的有效方法。
JNI和NDK的关系
通过对两者的定义以及特点的了解,我们可以总结如下
JNI
定义:Java中的接口
作用:用于Java与本地语言(C、C++)交互
NDK
定义:Andorid中的工具开发包
作用:快速开发C、C++的动态库,并且自动将so和应用一起打包成APK
两者的关系:JNI是实现的目的,NDK是在Android中实现JNI的手段。即在Android开发环境中,通过NDK从而实现JNI的功能。
Android NDK开发的流程
1. 安装必要的工具
确保你的开发环境已经安装了以下工具:
- Android Studio:这是Google官方推荐的Android开发环境。
- NDK:通过Android Studio的SDK Manager安装。
- CMake 或 ndk-build:用于编译C/C++代码。
- Gradle:Android Studio自带。
2. 创建新的Android Studio项目
- 打开Android Studio,选择"Start a new Android Studio project"。
- 选择一个项目模板(例如,Native C++)。
- 配置你的项目,包括项目名称、包名、保存位置等。
- 选择"Include C++ support"并继续。
- 完成创建。
3. 配置CMakeLists.txt或Application.mk
对于较新的项目,Android Studio通常会自动生成CMakeLists.txt文件。对于较旧的项目,可能需要手动创建这个文件或者使用Application.mk和Android.mk(如果你使用的是ndk-build)。
4. 编写C/C++代码
在src/main/cpp目录下编写你的C/C++代码。例如,创建一个native-lib.cpp文件
5. 在Java代码中调用C/C++代码
在Java类中,使用System.loadLibrary加载库,并调用本地方法
6. 构建和运行你的应用
- 在Android Studio中点击"Build"菜单,选择"Make Project"。
- 使用模拟器或真实设备运行你的应用。你可以通过点击"Run"按钮来运行应用。
- 确保你的设备或模拟器已经正确配置了NDK的支持。你可以在AVD(Android Virtual Device)的配置中设置。
7. 调试和优化
使用Android Studio的调试工具来调试你的C/C++代码。你可以设置断点、查看变量等。优化你的代码以提高性能。
开发过程中必须了解的一些名词
关键文件和配置
- Android.mk:描述原生库的构建配置(如库名、源文件路径)。
- Application.mk:指定ABI、工具链等全局编译参数。
- .so文件:编译Native代码的产物,原生库文件,嵌入Apk中供应用调用。
构建工具
- ndk-build:NDK自带的构建脚本,自动编译jni/目录中的代码。
- CMake:Android studio推荐的构建工具,支持Gradle集成。
其他术语
ABI(Application Binary Interface):不同设备架构(如armeabi-v7a、x86、x86-64、arm64-v8a)等,对于Android中的ABI,请参考:Android ABI介绍。
Gradle:Android官方推荐的项目构建系统,支持多项目构建和依赖管理。在Android项目中,Gradle可以用来配置和执行NDK相关的构建任务,例如指定要使用的NDK版本、设置原生库的路径等。
Shared Libraries(动态库):动态库(.so文件)是在运行时被加载的库文件,它们可以被多个应用共享。在Android NDK开发中,通常会将功能模块编译为动态库,然后在Java或Kotlin代码中通过JNI调用这些库。
之后我将持续更新NDK开发的相关介绍。