Android NDK初识

news2024/10/7 0:51:13

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

什么是Android NDK?

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

NDK 不适用于大多数初学的 Android 编程者,对许多类型的 Android 应用没什么价值。 因为它不可避免地会增加开发过程的复杂性,所以通常不值得使用。 但如果您需要执行以下操作,它可能很有用:

  • 在平台之间移植其应用。

  • 重复使用现有库,或者提供其自己的库供重复使用。

  • 在某些情况下提高性能,特别是像游戏这种计算密集型应用。

Android NDK提供的组件

Android NDK不是一个单独的工具,他是一个包含API、交叉编译器、链接程序、调试器、构建工具、文档和示例应用程序的综合工具集。以下是Android NDK的一些主要组件:

  • ARM、x86和MIPS交叉编译器

  • 构建系统

  • Java原生接口头文件(jni)

  • C库

  • Math库

  • POSIX线程

  • 最小的C++库

  • ZLib压缩库

  • 动态链接库

  • Android日志库

  • Android像素缓冲区库

  • Android原生应用APIs

  • OpenGL ES 3D图形库

  • OpenSL ES原生音频库

  • OpenMAX AL最小支持

Android NDK的结构

Android NDK组件都被安装在NDK的根目录下,下面介绍一些重要的文件和子目录。

  • ndk-build:ndk-build 脚本用于在 NDK 中心启动构建脚本,这些脚本:

    • 自动探测您的开发系统和应用项目文件以确定要构建的内容。

    • 生成二进制文件。

    • 生成二进制文件。

  • ndk-gdb:该shell脚本允许用GUN调试器调试原生组件。

  • ndk-stack:该shell脚本可以帮助分析原生组件崩溃时的堆栈追踪。

  • build:该目录包含了Android NDK构建系统的所有模块。

  • platforms:该目录包含了支持不同Android目标版本的头文件和库文件。Android NDK构建系统会根据具体的Android版本自动引用这些文档。

  • sources:该目录包含了可供开发人员导入到现有的Android NDK项目的一些共享模块。

  • toolchains:该目录包含目前Android NDK支持的不同目标机体系结构的交叉编译器。Android NDK目前支持ARM、X86和MIPS机体系结构。Android NDK构建系统根据选定的体系结构使用不同的交叉编译器。

【学习地址】:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发
【文章福利】:免费领取更多音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击1079654574加群领取哦~

Android NDK的开发流程

  1. 在java中声明Native方法

    public native String hello();
  2. 在jni目录中实现原生方法

    1. 首先创建jni目录。

    2. 在jni目录中创建c/c++文件,并实现对应的方法。

      #include <jni.h>
      #include <stdio.h>
      #include <stdlib.h>
      ​
      extern "C"
      JNIEXPORT jstring JNICALL
      Java_cn_com_codeteenager_ndkone_MainActivity_hello(JNIEnv *env, jobject obj) {
      ​
       return env->NewStringUTF("Hello World");
      }
    3. 添加Android.mk文件。

      LOCAL_PATH := $(call my-dir)
      include $(CLEAR_VARS)
      LOCAL_MODULE := helloworld
      LOCAL_SRC_FILES := HelloWorld.cpp
      LOCAL_C_INCLUDES += $(LOCAL_PATH)
       #LOCAL_LDLIBS := -llog
      include $(BUILD_SHARED_LIBRARY)
    4. 添加Application.mk文件。

      # 指定生成哪些cpu架构的库
      APP_ABI := armeabi-v7a
      # 此变量包含目标 Android 平台的名称
      APP_PLATFORM := android-22
  3. 通过命令行打开jni目录,然后执行ndk-build命令脚本进行编译。编译后的项目结果如图所示。

    • jni:该目录包含原生组件的源代码以及描述原生组件构建方法的Android.mk构建文件。

    • libs:在Android NDK构建系统的构建过程中创建该目录。他包含指定的目标机体系结构的独立子目录,在打包过程中该目录被包含在APK文件中。

    • obj:这是一个中间目录,编译源代码后所产生的目标文件都保存在该目录下。

Android NDK构建系统

Android NDK的构建系统是基于GUN Make的。该构建系统的主要目的是使开发人员能够用很短的构建文档来描述原生的Android应用程序。

Android NDK的其他两种编译方式

上述Android NDK的开发流程中通过配置Android.mk来编译是其中的一种方式,还有两种方式。

通过配置Android Studio中build.gradle来编译

这种方式简化了编写Android.mk文件,跟上述流程一样,只是不需要编写Android.mk和Application.mk,但是需要添加两样配置。

  • 在项目的gradle.properties中,添加android.useDeprecatedNdk = true。

  • 在主Module的build.gradle的defaultConfig里添加

    ndk{
          moduleName 'hello'
            abiFilter 'armeabi-v7a'
          }

注意:这种方式无法再Android Studio3.0以上使用,只能在3.0以下使用,3.0及以上采用cmake来编译生成so文件。

通过Android Studio的cmake插件编译

在Android Studio2.2及以上版本中,可以使用cmake插件来编译c库,这也是最新的ndk开发方式。首先你需要在SDK Tools中下载CMake和LLDB这两个组件,当然ndk也是必须的。

  • CMake:一款外部构建工具,可与Gradle搭配使用来构建原生库。如果您想用ndk-build,则不需要此组件。

  • LLDB:一种调试程序,Android Studio使用它来调试原生代码。

当你安装好上述两个组件后,你可以使用Android Studio创建支持C/C++的新项目。步骤如下:

  1. 在向导的 Configure your new project 部分,选中 Include C++ Support 复选框。

  2. 点击 Next

  3. 正常填写所有其他字段并完成向导接下来的几个部分。

  4. 在向导的 Customize C++ Support 部分,您可以使用下列选项自定义项目:

    • C++ Standard:使用下拉列表选择您希望使用哪种 C++ 标准。选择 Toolchain Default 会使用默认的 CMake 设置。

    • Exceptions Support:如果您希望启用对 C++ 异常处理的支持,请选中此复选框。如果启用此复选框,Android Studio 会将 -fexceptions 标志添加到模块级 build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake。

    • Runtime Type Information Support:如果您希望支持 RTTI,请选中此复选框。如果启用此复选框,Android Studio 会将 -frtti 标志添加到模块级 build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake。

  5. 点击 Finish,创建成功,项目结构如下图所示。

  • cpp文件夹用于存放C/C++文件。

  • 在External Build Files中,CMakeLists.txt是构建原生库的CMake脚本。

当你创建完成项目后点击Android Studio中Build->Make Project,系统会帮你构建完成后,你就可以在相对应Module下的build->intermediates->cmake下找到so库。

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

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

相关文章

工业物联网案例:智能工厂设备无人值守系统方案

智能工厂又称“黑灯工厂”&#xff0c;具备智能化、自动化、无人化等特点&#xff0c;可以实现全天候高效的生产工作&#xff0c;是制造业的先进典范。通过工厂设备无人值守系统&#xff0c;可以集中采集、传输、处理、显示各类工业设备数据&#xff0c;可以对空压机、变电站、…

Gitee配置静态页面

辛辛苦苦写好了一个静态网页&#xff0c;想让大家都可以通过网络访问看到这个网页。比如&#xff0c;个人简历&#xff0c;个人静态页面作品展示等。 但是不想买服务器&#xff0c;配置域名&#xff0c;备案&#xff0c;什么的。 可以使用 Gitee Pages 服务&#xff0c;将静态…

Qt-FFmpeg开发-打开本地摄像头录制视频(7)

Qt-FFmpeg开发-打开本地摄像头录制视频【软解码 OpenGL显示YUV】 文章目录Qt-FFmpeg开发-打开本地摄像头录制视频【软解码 OpenGL显示YUV】1、概述2、实现效果3、FFmpeg录制视频编码流程4、主要代码5、完整源代码更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&…

【车辆动力】基于matlab模拟停车动力学【含Matlab源码 2258期】

⛄一、获取代码方式 获取代码方式1: 完整代码已上传我的资源:【车辆动力】基于matlab模拟停车动力学【含Matlab源码 2258期】 点击上面蓝色字体,直接付费下载,即可。 获取代码方式2: 付费专栏物理应用(Matlab) 备注: 点击上面蓝色字体付费专栏物理应用(Matlab),扫…

【教学类-20-02】20221203《世界杯16强国旗-定量版》(大班)

展示效果&#xff1a; &#xff08;1个国家2张&#xff0c;16国旗&#xff0c;共32张&#xff09; 打印效果&#xff1a; 背景需求&#xff1a; 上一份代码打印后发现&#xff1a; 1.打印时发现随机抽取的图案不稳定&#xff0c;30张”澳大利亚”“波兰”的图片特别多。因为…

STM32定时器笔记

学习江科大自化协的stm32教程记录的笔记 一、TIM定时器 定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断 例&#xff1a;stm32中定时器的基准时钟一般是72MHZ&#xff0c;【周期是频率的倒数1T 1/72us】&#xff0c;如果计数72个&#xff0c;就是…

[附源码]Python计算机毕业设计Django松林小区疫情防控信息管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Netty(三)- NIO三大组件之Channel

文章目录一、Channel 基本介绍二、FileChannel 类三、Channel 应用案例1. 应用实例 1 - 本地文件写数据2. 应用实例 2 - 本地文件读数据3. 应用实例 3 - 使用一个Buffer 完成文件读取、写入4. 应用实例 4 - 拷贝文件transferFrom方法一、Channel 基本介绍 NIO的通道类似于流&am…

Mybatis:自定义映射resultMap(7)

Mybaits笔记框架&#xff1a;https://blog.csdn.net/qq_43751200/article/details/128154837 自定义映射resultMap1. Mybatis环境搭建2. 问题引入3. 解决表中的字段名和对应类的属性名不一致问题方式一&#xff1a; 为字段起别名&#xff0c;保持和属性名的一致方式二&#xff…

html静态网站基于HTML+CSS+JavaScript上海美食介绍网站网页设计与实现共计5个页面

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

K邻近算法k值选取以及kd树概念、原理、构建方法、最近邻域搜索和案例分析

一、k值选择 K值过小&#xff1a;容易受到异常点的影响k值过大&#xff1a;受到样本均衡的问题 近似误差&#xff1a;对现有训练集的训练误差&#xff0c;关注训练集&#xff0c;如果近似误差过小可能会出现过拟合的现象&#xff0c;对现有的训练集能有很好的预测&#xff0c;…

基于RockyLinux8.7一键安装OpenStack Yoga版本

硬件环境 虚拟软件&#xff1a;vmware workstation16 操作系统&#xff1a;RockyLinux8 虚拟机硬件配置&#xff1a; CPU&#xff1a;2 memory&#xff1a;8G disk&#xff1a;80G net card&#xff1a;1个—VMnet8 ip/netmask&#xff1a;192.168.9.160/24 下载并安装RockyL…

python:最小二乘法拟合原理及代码实现

这里写目录标题原理代码实现原理 最小二乘法适用于对处理的一堆数据&#xff0c;不必精确的经过每一点&#xff0c;而是根据图像到每个数据点的距离和最小确定函数。需要注意的是&#xff0c;最小二乘是对全局进行拟合优化&#xff0c;对噪声比较敏感&#xff0c;所以如果有噪…

知识点7--Docker的容器命令

本篇为大家介绍Docker的容器命令&#xff0c;也顺带着让大家明白Docker和vmware都属于虚拟化技术下的软件&#xff0c;但是他们的不同之处不止在于运行的系统不同&#xff0c;他们的运行逻辑也不同&#xff0c;VMware是虚拟化完整的系统&#xff0c;而docker是隔离一个进程&…

03 - 调试环境的搭建(Bochs)(实验未完)

---- 整理自狄泰软件唐佐林老师课程 1. Bochs&#xff08;另一款优秀的虚拟机软件&#xff09; 专业模拟x86架构的虚拟机 开源且高度可移植&#xff0c;由C编写完成 支持操作系统开发过程中的断点调试 通过简单配置就能运行绝大多数主流的操作系统 2. Bochs的安装与配置 下载…

数字化升级里,RPA的下一步正在走向哪?

如果说&#xff0c;API这种能力在2021年并未成为“刚需”&#xff0c;那么在2022年其已经一跃成为RPA进入企业真正场景的“必需品”。 作者|斗斗 编辑|皮爷 出品|产业家 今年八月&#xff0c;调查机构Gartner发布了2022全球RPA魔力象限。 数据显示&#xff0c;2021年&a…

空间直接坐标系(XYZ)转经纬度(BLH)

本章首先介绍空间直角坐标系与大地坐标系&#xff0c;然后列出XYZ转换BLH的公式&#xff0c;最后基于C语言完成该部分代码设计。 参考书籍&#xff1a; 董大男&#xff0c;陈俊平&#xff0c;王解先等&#xff0c;GNSS高精度定位原理&#xff0c;科学出版社 黄丁发&#xff0c;…

图扑软件荣获第七届“创客中国”中小企业创新创业大赛优胜奖

2022 年 11 月 17 日&#xff0c;由工业和信息化部、财政部共同主办的第七届“创客中国”中小企业创新创业大赛全国总决赛在浙江杭州落下帷幕。 本次《第七届“创客中国”中小企业创新创业大赛》举办目的&#xff0c;意在加大优质中小企业梯度培育力度&#xff0c;进一步提升中…

高新技术企业如何规划

如何提高申报高企的成功率&#xff0c;应该是很多企业关心的一个问题。 2022年高新技术企业申报已经结束&#xff0c;今年第三批申报的企业结果也将公示&#xff0c;有客户会问&#xff0c;历年来你们申报高企通过率这么高&#xff0c;是怎么做到的&#xff1f; 那么现在呢&a…

《痞子衡嵌入式半月刊》 第 66 期

痞子衡嵌入式半月刊&#xff1a; 第 66 期 这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻&#xff0c;农历年分二十四节气&#xff0c;希望在每个交节之日准时发布一期。 本期刊是开源项目&#xff08;GitHub: JayHeng/pzh-mcu-bi-weekly&#xff09;&#xff0c;欢…