Android 中的 NDK 到底是什么?(详细解析+案例实战)

news2024/11/26 4:37:07

NDK 提供了一系列的工具,帮助开发者快速开发 C (或 C++ )的动态库,并能自动将 so 和 java 应用一起打包成 apk;这些工具对开发者的帮助是巨大的

什么是 NDK ?

Android 原生开发包 NDK(Native Delopment kits )将用于 Android 平台上的 C++ 开发

Android NDK 是 Android 软件开发包(SDK)的相关工具集,用来扩展 Android SDK 的功能,从而是开发人员能够使用机器代码生成的编程语言(如 C、C++ 和汇编语言)实现一些对代码行要求较高的模块并将这些模块嵌入到 Android 应用程序中

众所周知,Android 程序运行在 Dalvik 虚拟机中,NDK 允许用户使用类似 C / C++ 之类的原生代码语言执行部分程序

NDK 的定义

  • Android NDK 不是一个单独的工具: 它是一个包含API、交叉编译器、链接程序、调试器、构建工具、文档和实例应用程序的综合工具集
  • 在 Android 的官方文档上是这么解释 NDK 的:“原生开发套件 (NDK) 是一套工具,使您能够在 Android 应用中使用 C 和 C++ 代码,并提供众多平台库,您可使用这些平台库管理原生 Activity 和访问物理设备组件;例如传感器和轻触输入”
  • NDK 是一个 Android 官方提供的一个开发套件与 Android SDK 相对应,NDK 是原生开发套件,而 SDK 是 JAVA 开发套件。NDK 使得 Android 应用可以利用 C++ 语言高效的计算性能,进一步提升App的性能,降低延迟。

说道这里,大家肯定要问 NDK 有那些应用场景,我为什么要用 NDK 呢,用 JAV 不行吗?

下面列举一些NDK 的应用场景

重用一些现成的库,例如已经用 C/C++ 编写好的 openCV 库
前面提到的高性能计算,例如很多 Bitmap 的处理到放在 NDK 进行处理
一些敏感信息的保护,例如密钥等信息(密钥等信息还是要经过加盐才能放到 NDK 中,不然还是
会有别反编译的风险)
知道了应用场景,大家肯定已经摩拳擦掌准备试一试了,先别着急。欲善其事,先利其器;以下给出了开发 NDK 的三大利器;

NDK 的三大开发组件
  • NDK  Android 原生开发套件

  • CMAKE 外部编译工具

  • LLDB  原生代码调试工具

NDK 开发优点

  • 利用 NDK 开发的库,不容易被反编译,保密性,安全性都提高了
  • 很多开源工程和大工程都是 C/C++ 代码写的
  • C/C++ 的代码运行速度和效率都比 Java 快很多

Android NDK 开发步骤

(1)JNI 接口设计;
(2)使用 C/C++ 本地实现方法;
(3)生成动态链接库;
(4)将动态链接库复制到 Java 工程,运行 Java 程序

NDK 基础实践

CMake

推荐使用 CMake 而不是传统 NDK-build 的方式,既然都用新的,自然有它的道理,简单方便
有很多人在配置 CMakeLists.txt 时编译不通过,是自己的问题吗?当然,难不成还是它的问题吗?

首先我们想要打出一个.so文件来,我们肯定是要先写Java代码

第一步:

解释一下这里代码的意思: native 这个就是我们提供出去的方法,这个方法到时候要和 .c 文件里面或者 .cc 文件里面的方法名一致,我们再静态中去加载我们打出来的 .so 文件, 这里的参数名字不是 .so 文件的名字,而是我们在打包的时候配置的名字,这个配置下面介绍

public class JniKit {
    //这里的方法名如果报错那是正常的,不影响
    public static native int calculate(int num);

    static {
        System.loadLibrary("JniDemo");
    }
}

第二步:

我们需要根据这个写好的 Java 文件来生成一个 .h 文件,生成 .h 文件是通过 javah 来执行的,这里我之前尝试了各种办法,但是网上说的办法都没办法成功,都是报错说找不到类文件,我觉得这里可能和我的文件的方法有点问题,等会我把我现在成功的文件目录贴出来,执行的代码

javah -classpath D:\360PhoneInfo\small-video-record-master\SmallVideoRecord2\testndk\build\intermediates\classes\debug -d jni
 com.example.testndk.JniKit
}

根据这个代码我得到了.h文件,包括这个jni文件夹也是通过-d jni这个生成出来的,不是自己创建的

第三步:

现在我们有了 .h 文件了,接下来就是写 .c 文件了,当然了我不会 c 语言,所以这里拿了一个测试的来用, c 这部分的不用关注太多 include中指向你创建的 .h 头文件 Java_com_example_testndk_JniKit_calculate;Java 包名类名方法名(参数)

#include "com_example_testndk_JniKit.h"

JNIEXPORT jint JNICALL Java_com_example_testndk_JniKit_calculate(JNIEnv *env, jclass cls, jint num) {
    return num * num;
}

第四步:

现在 .h.c 文件我们都有了,接下来就是最关键的一步了,生成 .so 文件了,这一步,我查阅了很多资料,折磨了两个小时,才弄出来,这里我不知道是不是我的配置有问题,还是什么问题,反正我在 build.gradle 配置,然后去 Make Project 生成了很久没有生成出来,这里我是用命令行中的 ndk-build 来解决的

解决方式如下:

1、建立一个 Android.mk 文件

LOCAL_MODULE 表示模块名称 LOCAL_SRC_FILES 表示需要参与编译的源文件,就是我们的 c 除了这两个,其他照搬即可

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := JniDemo
LOCAL_SRC_FILES := jni_test.c
LOCAL_LDLIBS +=-L$(SYSROOT)/usr/lib -lm -llog
include $(BUILD_SHARED_LIBRARY)

2、建立一个Application.mk文件

需要注意的东西都写在里面了,以逗号分割cpu指令

APP_STL := gnustl_static  
APP_CPPFLAGS := -frtti -fexceptions  
APP_ABI := armeabi-v7a       #这句是设置生成的cpu指令类型,提示,目前绝大部分安卓手机支持armeabi,libs下太多类型,编译进去 apk 包会过大  
APP_PLATFORM := android-8    #这句是设置最低安卓平台,可以不弄 

3、因为我的这两个文件是和 .h.c 放在同一个文件夹中 -jni,所以我们要执行 ndk-build 命令需要进入到 jni 文件夹下再去执行

这里给一个范例,传入字符串调用 so 库中的方法

public class JniUtil {
    static {
        System.loadLibrary("JniUtil");
    }

    public static native void initialize(String string, String logPath);
}
extern "C"
JNIEXPORT void JNICALL Java_com_kxqin_livingrecognitiondemo_JniUtil_initialize
        (JNIEnv* env, jclass jclazz ,jstring jstring1, jstring logPath){
    //获取字符串指针,必须使用指针,不能使用char strContent[],因为GetStringUTFChars()返回值为const char *;
    const char *str = env->GetStringUTFChars(jstring1, JNI_FALSE);
    const char *path = env->GetStringUTFChars(logPath, JNI_FALSE);
    std::string log = path;
    std::string string = str;
    //头文件中的方法
    defence_native_initialize(string, log);
    //LOGD("initialize is success");
}

然后直接 JniUtil.initialize (String1,String2) 就可以调用到 cpp 中的方法了

试试在 Terminal 中输入

adb logcat | ndk-stack -sym app\build\intermediates\cmake\debug\obj${ABI}

将 ${ABI} 换为你的 ABI,正常情况下在模拟器上使用就是 x86,真机就是 armabi-v7a 或 arm64-v8a,
或许能帮你解决不少麻烦

总结

通过前面详细的讲解,我想各位读者应该对 NDK 有一个清晰的认识了下面让我在最后用一句话总结那就是NDK 则是 Android 妈咪谷歌提供的一种开发工具套件

如果想学习更多 Android 进阶知识或者获取音视频相关技术文档,请私信发送 “进阶” 即可直达;里面包含了面试资源系统整理分享,Java 语言进阶和 Kotlin 语言与 Android 相关技术内核, APP 开发框架知识、 Android 前沿技术,高级 UI、Gradle 等技术文档

好了,以上就是今天要分享的内容,大家觉得有用的话,可以点赞分享一下;如果文章中有什么问题欢迎大家指正;欢迎在评论区或后台讨论哈~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/621593.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue中process.env关键字,process.env.VUE_APP_BASE_API

1.process.env 是Node.js 中的一个环境 打开命令行查看环境: 2.process.env与Vue CLI 项目 Vue Cli 有以下三种运行模式 development 模式用于 vue-cli-service serve test 模式用于 vue-cli-service test:unit production 模式用于 vue-cli-service build 和 vue-c…

pip安装教程 python(针对于Windows系统)

1.什么是pip pip 是 Python 包管理工具,该工具提供了对Python 包的查找、下载、安装、卸载的功能。 目前如果你在 python.org 下载最新版本的安装包,则是已经自带了该工具。 pip 官网:https://pypi.org/project/pip/ 2.判断本机是否安装p…

chatgpt赋能python:Python中如何将NaN变为0

Python中如何将NaN变为0 Python是一种动态、强类型的编程语言,因其简单易学、功能强大,被广泛应用于各种领域。其中NumPy和Pandas是数据科学界最常用的Python库,而在数据处理中,处理缺失值通常是必不可少的。本文将介绍如何使用P…

学成在线----day3

1、JSR303校验 对填入的数据自动做一些约束 package com.xuecheng.content.model.dto;import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data;import javax.validation.constraints.NotEmpty; import javax.validati…

PyCharm安装教程(2023年,3月)

下载PyCharm之前需要准备下载Python 链接:Python安装教程 一、PyCharm下载 1、进入JetBrains官网: 官网地址:https://www.jetbrains.com/ 2、点击【Developer Tools】 开发者工具,选择【PyCharm】点击跳转到PyCharm界面。点击…

【Docker】 7.Docker Internet

文章目录 Docker InternetDocker Internet CommandDocker Bridge Internetdocker Host InternetDocker Container InternetDocker None Internet Docker Internet Docker 网络架构采用的设计规范是CNM(Container Network Model)。CNM中规定了Docker网络…

RK3588平台开发系列讲解(同步与互斥篇)自旋锁死锁实验

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、自旋锁死锁二、实验程序的编写2.1、驱动程序编写2.2、编写测试 APP沉淀、分享、成长,让自己和他人都能有所收获!😄 📢自旋锁若是使用不当就会产生死锁,在本篇将会对自旋锁的特殊情况-死锁进行讲解。 一、自…

0801详解-redux-react

文章目录 1 redux1.1 概述1.2 示例实现页面数字的加、减1.3 异步加-异步action 2 react-redux2.1 概述2.2 优化示例代码 3 数据共享4 redux开发者工具5 小结5.1 求和案例_redux精简版5.2 求和案例_redux完整版5.3 求和案例_redux异步action版5.4 求和案例_react-redux基本使用5…

【哈士奇赠书活动 - 25期】-〖Python自动化办公应用大全(ChatGPT版) 〗

文章目录 ⭐️ 赠书 - 《Python自动化办公应用大全(ChatGPT版)》⭐️ 内容简介⭐️ 作者简介⭐️ 编辑推荐⭐️ 赠书活动 → 获奖名单 ⭐️ 赠书 - 《Python自动化办公应用大全(ChatGPT版)》 ⭐️ 内容简介 本书全面系统地介绍了P…

使用YOLOv5实现图片、视频的目标检测

推断的准备工作 接下来我将从官方代码开始,一步一步展示如何进行图片、视频识别 首先从GitHub下载官方代码(也可以从下面链接获取): 链接:https://pan.baidu.com/s/16wzV899D90TY2Xwhx4TwhA 提取码:vzvj …

MYSQL必知必会,详尽入门,一文帮你学会SQL必知必会

目录 前言 数据库的概念和术语 SQL语言和组成 DDL show : 展示当前已有的数据库或者表 create :创建一个数据库或者一个表 drop :删除表、数据库对象或者视图 alter :修改现有的数据库对象,例如 修改表的属性或者字段 (…

geth下载安装配置环境及联盟链的搭建

以太坊概论考察课 更具课堂教学讲解,参考开放资料。使用所学的知识,创建项目并完成要求的内容。包含的功能和要求具体如下: 一:安装并运行geth客户端 1、下载安装geth 首先下载geth:https://geth.ethereum.org/dow…

javaScript蓝桥杯---视频弹幕

目录 一、介绍二、准备三、⽬标四、代码五、完成 一、介绍 弹幕指直接显现在视频上的评论,可以以滚动、停留甚⾄更多动作特效⽅式出现在视频上,是观看视频的⼈发送的简短评论。通过发送弹幕可以给观众⼀种“实时互动”的错觉,弹幕的出现让观…

Segment Anything Model (SAM)——卷起来了,那个号称分割一切的CV大模型他来了

最近每天打开微信看到10个公众号里面差不多有11个都在各种玩赚chatGPT,每个都在说是各种大好风口,哎,看得眼睛都是累的。 今天下午无意间看到Meta发布了一款号称能分割一切的CV大模型,CV圈也开始卷起来,今年各种大模型…

chatgpt赋能python:Python在图片处理方面的应用

Python在图片处理方面的应用 在当今数字化的时代,图像处理已成为不可避免的技术。越来越多的业务需要对图片进行处理、识别和分析。Python是一种易于使用且适合处理图像的编程语言。Python中有许多图像处理库,例如Pillow、Scikit-Image和OpenCV等&#…

基于BP神经网络的PID智能控制

基于BP神经网络的PID智能控制 基于BP神经网络的PID整定原理经典的增量式数字PID控制算法为:BP神经网络结构:学习算法仿真模型Matlab代码仿真效果图结论python仿真参考文献 基于BP神经网络的PID整定原理 PID控制要获得较好的控制效果,就必须通…

山东大学单片机原理与应用实验 3.4 矩阵键盘扫描实验

目录 一、实验题目 二、实验要求 三、实验过程及结果记录 1. 在Proteus 环境下建立图1所示原理图,并将其保存为keyscan_self.DSN 文件。 2. 编写控制源程序,将其保存为keyscan_self.asm 或keyscan_self.c。 3. 将源程序添加到U1 中,并构…

chatgpt赋能python:Python如何将空格变成换行

Python如何将空格变成换行 Python是一种流行的编程语言,有着许多实用的功能和库。在这篇文章中,我们将介绍如何使用Python将空格变成换行的方法。这是一种有用的技巧,可以帮助你在处理文本时更加方便。 为什么需要将空格变成换行 将空格变…

eNSP数据抓包时弹不出Wireshark.exe

文章目录 原因:wireshark的版本问题解决方法:操作例图 原因:wireshark的版本问题 上述2.6.6版本安装后,ensp工具路径正确,数据抓包也始终打不开wireshark,但是直接打开是可以打开的。安装3.6.3版本后&#…

零基础使用ChatGPT写一个小游戏---文末附源码

ChatGPT:赋能自然语言处理的多种应用领域 ChatGPT是当今最先进的人工智能对话系统之一,已经被证明可以支持许多不同的自然语言处理应用程序。以下是ChatGPT可以运行的几个领域: 聊天机器人 ChatGPT作为一个建立在自然语言处理技术上的人工…