使用NDK进行开发android
一、NDK开发相关概念
- JNI(Java Native Interface)
- JNI是Java原生接口,是Java和其他原生代码语言(例如C和C++)通信的桥梁。它是Java的一种特性和协议,开发者可以通过JNI在Java中调用C/C++代码或在C/C++中调用Java代码。
- NDK(Native Development Kit)
- NDK是原生开发工具集,是一套允许您使用原生代码语言(例如C和C++)实现程序功能的工具集。在Android开发中,NDK有诸多应用场景,例如直播推流、图片压缩(如jpeg压缩)、加密(如AES加密等)、算法类(如图像处理算法、视频编解码算法如ffmpeg等)以及其他需要使用C/C++开发的场景(如增量更新等)。
- ABI(Application Binary Interface)
- 不同的CPU支持不同的指令集,CPU与指令集的每种组合都有其自己的应用二进制接口(或ABI),ABI可以非常精确地定义应用的机器代码在运行时如何与系统交互。
- CMake
- Android推荐使用的NDK构建工具,从AS2.2版本之后开始支持(包含2.2版本)。它是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程),能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake,其组态档取名为CMakeLists.txt。
二、环境搭建
- CMake:NDK构建工具。
- LLDB:NDK调试工具。
- NDK:NDK开发工具集。
- 在创建项目时,勾选【Include C++ support】选项,然后一路下一步,到达【Customize C++ Support】设置页。在这里可以设置C++标准(如选择【Toolchain Default】会使用默认的CMake配置),还可以选择是否支持C++异常处理(标志为 - fexceptions)和是否支持程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型( - frtti)。如果使用默认C++标准,不勾选下面的两个选项,点击【Finish】按钮进入下一个环节。
三、NDK项目相关配置
- build.gradle配置
- 在build.gradle配置中多了两个externalNativeBuild配置项。在defaultConfig里面主要配置了Cmake的命令参数(例如在创建项目时,如果勾选了【ExceptionsSupport】和【RuntimeTypeInformationSupport】选项会有相应配置)。
- CMakeLists.txt
- CMakeLists.txt是CMake的构建脚本,作用相当于ndk - build中的Android.mk。在其中可以进行诸如声明CMake使用版本(如cmake_minimum_required(VERSION3.4.1))、设置so库名称(如add_library() native - lib)、指定C/CPP文件路径(如src/main/cpp/native - lib.cpp)等操作。可以将library的编译模式设置为SHARED模式,点击AS的编译按钮,在app/build/intermediates/cmake/debug/obj目录下会生成不同CPU架构对应的so文件。生成的so文件可以在其他项目中使用,在项目的app/src/main目录下创建jniLibs文件夹,将生成的so文件(带着CPU架构目录)拷贝到jniLibs文件夹中,按照相应的调用方式即可正常使用。
四、Java代码与C/C++代码交互示例
- 在java代码中创建一个类,例如:
- ```java public class AddNum{ //这里调用c的方法 public native int add(int a, int b); static{ //加载动态库 System.loadLibrary(add); } }
- ```
- 生成C的头文件
- 在java代码所在的包下(最上层,在Android Studio中可以直接在Terminal)输入命令来生成。
本篇文章所含信息均从网络公开资源搜集整理,旨在为读者提供参考。尽管我们在编辑过程中力求信息的准确性和完整性,但无法对所有内容的时效性、真实性及全面性做出绝对保证。读者在阅读和使用这些信息时,应自行评估其适用性,并承担可能由此产生的风险。本网站/作者不对因信息使用不当或误解而造成的任何损失或损害承担责任。
