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开发的相关介绍。

相关推荐
selt79118 分钟前
Redisson之RedissonLock源码完全解析
android·java·javascript
Yao_YongChao1 小时前
Android MVI处理副作用(Side Effect)
android·mvi·mvi副作用
非凡ghost2 小时前
JRiver Media Center(媒体管理软件)
android·学习·智能手机·媒体·软件需求
席卷全城2 小时前
Android 推箱子实现(引流文章)
android
齊家治國平天下2 小时前
Android 14 系统中 Tombstone 深度分析与解决指南
android·crash·系统服务·tombstone·android 14
maycho1234 小时前
MATLAB环境下基于双向长短时记忆网络的时间序列预测探索
android
思成不止于此5 小时前
【MySQL 零基础入门】MySQL 函数精讲(二):日期函数与流程控制函数篇
android·数据库·笔记·sql·学习·mysql
brave_zhao5 小时前
达梦数据库(DM8)支持全文索引功能,但并不直接兼容 MySQL 的 FULLTEXT 索引语法
android·adb
sheji34165 小时前
【开题答辩全过程】以 基于Android的网上订餐系统为例,包含答辩的问题和答案
android
easyboot5 小时前
C#使用SqlSugar操作mysql数据库
android·sqlsugar