Android NDK入门

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 代码)
需要注意:

  1. JNI是java调用Native语言的一种特性
  2. 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项目

  1. 打开Android Studio,选择"Start a new Android Studio project"。
  2. 选择一个项目模板(例如,Native C++)。
  3. 配置你的项目,包括项目名称、包名、保存位置等。
  4. 选择"Include C++ support"并继续。
  5. 完成创建。

3. 配置CMakeLists.txt或Application.mk

对于较新的项目,Android Studio通常会自动生成CMakeLists.txt文件。对于较旧的项目,可能需要手动创建这个文件或者使用Application.mkAndroid.mk(如果你使用的是ndk-build)。

4. 编写C/C++代码

src/main/cpp目录下编写你的C/C++代码。例如,创建一个native-lib.cpp文件

5. 在Java代码中调用C/C++代码

在Java类中,使用System.loadLibrary加载库,并调用本地方法

6. 构建和运行你的应用

  1. 在Android Studio中点击"Build"菜单,选择"Make Project"。
  2. 使用模拟器或真实设备运行你的应用。你可以通过点击"Run"按钮来运行应用。
  3. 确保你的设备或模拟器已经正确配置了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开发的相关介绍。

相关推荐
用户69371750013845 小时前
4.Kotlin 流程控制:强大的 when 表达式:取代 Switch
android·后端·kotlin
用户69371750013845 小时前
5.Kotlin 流程控制:循环的艺术:for 循环与区间 (Range)
android·后端·kotlin
Android系统攻城狮5 小时前
Android ALSA驱动进阶之获取周期帧数snd_pcm_lib_period_frames:用法实例(九十五)
android·pcm·android内核·音频进阶·周期帧数
雨白7 小时前
Jetpack Compose 实战:自定义自适应分段按钮 (Segmented Button)
android·android jetpack
AskHarries7 小时前
RevenueCat 接入 Google Play 订阅全流程详解(2025 最新)
android·flutter·google
The best are water8 小时前
MySQL FEDERATED引擎跨服务器数据同步完整方案
android·服务器·mysql
消失的旧时光-19438 小时前
我如何理解 Flutter 本质
android·前端·flutter
czhc11400756639 小时前
C#1119记录 类 string.Split type.TryParse(String,out type 变量)
android·c#
豆豆豆大王10 小时前
Android SQLite 数据库开发完全指南:从核心概念到高级操作
android·sqlite·数据库开发
_李小白10 小时前
【Android FrameWork】延伸阅读:AssetManager
android