什么是NDK

Android NDK 是一组允许您将 C 或 C++(“原生代码”)嵌入到 Android 应用中的工具。

在 Android 应用中使用原生代码的应用场景

  • 在平台之间移植其应用。
  • 重复使用现有库,或者提供其自己的库供重复使用。
  • 在某些情况下提高性能,特别是像游戏这种计算密集型应用。

为 Android 构建原生应用时使用的主要组件

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

    • 自动探测您的开发系统和应用项目文件以确定要构建的内容。
    • 生成二进制文件。
    • 将二进制文件复制到应用的项目路径。
  • Java:Android 构建过程从 Java 来源生成 .dex (Dalvik EXecutable) 文件,这些文件是 Android OS 在 Dalvik 虚拟机(“DVM”)中运行的文件。 即使您的应用根本未包含任何 Java 源代码,构建过程仍会生成原生组件在其中运行的 .dex 可执行文件。
  • 原生共享库:NDK 从原生源代码构建这些库或 .so 文件。
  • 原生静态库:NDK 也可构建静态库或 .a 文件,您可以关联到其他库。
  • Java 原生接口 (JNI):JNI 是 Java 和 C++ 组件用以互相沟通的接口。
  • 应用二进制界面 (ABI):ABI 可以非常精确地定义应用的机器代码在运行时如何与系统交互。 NDK 根据这些定义构建 .so 文件。 不同的 ABI 对应不同的架构:NDK 包含对 ARMEABI(默认)、MIPS 和 x86 的 ABI 支持。
  • 清单:如果您要编写没有 Java 组件的应用,必须在清单中声明 NativeActivity 类。

下面两个项目仅在使用 ndk-build 脚本构建时以及使用 ndk-gdb 脚本调试时才需要。

  • Android.mk:必须在 jni 文件夹内创建 Android.mk 配置文件。 ndk-build 脚本将查看此文件,其中定义了模块及其名称、要编译的源文件、版本标志以及要链接的库。
  • Application.mk:此文件枚举并描述您的应用需要的模块。 这些信息包括:
    • 用于针对特定平台进行编译的 ABI。
    • 工具链。
    • 要包含的标准库(静态和动态 STLport 或默认系统)。

开发Android原生应用的一般流程

  1. 设计应用,确定要在 Java 中实现的部分,以及要以原生代码形式实现的部分。
  2. 像创建任何其他 Android 项目一样创建一个 Android 应用项目。
  3. 在“JNI”目录中创建一个描述原生库的 Android.mk 文件,包括名称、标志、链接库和要编译的源文件。
  4. 或者,也可以创建一个配置目标 ABI、 工具链、发行/调试模式和 STL 的 Application.mk 文件。对于其中任何您未指明的项目,将分别使用以下默认值:
    • ABI:armeabi
    • 工具链:GCC 4.8
    • 模式:发行
    • STL:系统
  5. 将原生来源置于项目的 jni 目录下。
  6. 使用 ndk-build 编译原生(.so.a)库。
  7. 构建 Java 组件,生成可执行 .dex 文件。
  8. 将所有内容封装到一个 APK 文件中,包含 .so.dex 以及应用运行所需的其他文件。###

Tips

  1. 本系列文章开发工具采用Android Studio
  2. 构建工具使用CMake,但是为了兼容旧项目,会简要介绍一下Android.mk文件
  3. demo地址:https://github.com/cmder/ndkdemo.git

NDK开发系列第一章相关推荐

  1. HTML5 2D游戏引擎研发系列 第一章

     HI,大家好,我是白泽,一名游戏设计师,一直专注各平台的2D游戏引擎研发,HTML5是我准备进入的新领域,我有个习惯,刚接触的新领域我都会习惯自己写一套游戏引擎,而不用第三方提供的,为了方便自己学习 ...

  2. WEBGL 2D游戏引擎研发系列 第一章 新的开始

    WEBGL 2D游戏引擎研发系列 第一章 <新的开始> ~\(≥▽≤)/~HTML5游戏开发者社区(群号:326492427) 转载请注明出处:http://html5gamedev.or ...

  3. 路飞学城python电子书_路飞学城-Python开发集训-第一章

    路飞学城-Python开发集训-第一章 1.本章学习心得.体会 我: 间接性勤奋. 我: 学习方法论:输入--输出---纠正 我: 对对对 走出舒适区, 换圈子, 转思路,投资自我加筹码. 我: 圈子 ...

  4. Java极速入门系列:第一章Java概述、Java环境、IDEA开发工具

    Java极速入门-第一章Java概述.Java环境.IDEA开发工具 一.什么是Java 1.好的编程语言的特性 2.Java的特点 3.Java的运行机制 4.Java的三大体系 5.Java环境 ...

  5. 零基础玩转C语言系列第一章——初始C语言(上)

    目录 一.如何学好C语言? 1.鼓励你,为你叫好. 2.挤时间学习 3.学好编程,不仅仅是学好C语言 二.初始C语言 本章目标 本章重点 1.什么是C语言? 2.第一个C语言程序 3.数据类型 4.变 ...

  6. ARM体系结构与编程阅读笔记系列(第一章)

    系列文章目录 第一章 ARM概述机器基本编程模型 ARM概述及其基本编程模型 系列文章目录 前言 ARM体系结构的版本及命名方法 ARM体系结构的版本 ARM体系结构的变种 ARM/Thumb体系版本 ...

  7. python应用开发实战第一章 兽人之袭0.0.1

    第一章:采用面向对象编程实现兽人之袭文本游戏 1.采用面向对象编程实现 # python应用开发实战 #兽人之袭v1.0.面向对象编程 ''' 需求分析: 1.获得所有木屋击败木屋里的所有敌人 2.可 ...

  8. Unix/Linux下的Curses库开发指南——第一章 Curses库开发简介

    1.1什么是curses curses实际上是一个函数开发包,专门用来进行UNIX下终端环境下的屏幕界面处理以及I/O处理.通过这些函数库,C和C++程序就可以控制终端的视频显示以及输入输出.使用cu ...

  9. 蓝桥杯算法竞赛系列第一章——位运算的奇巧淫技及其实战

    遇见蓝桥遇见你,不负代码不负卿! 第二章"递归"已将更新咯,欢迎铁汁们点评!蓝桥杯算法竞赛系列第二章--深入理解重难点之递归(上)_安然无虞的博客-CSDN博客 目录 一.位运算符 ...

最新文章

  1. 如何使用YUM列出包的内容?
  2. xxe漏洞攻防 简介 xml 引用外部实体 构造恶意内容
  3. A-Light-and-Fast-Face-Detector-for-Edge-Devices
  4. 查看python版本号-Mac终端查看python版本号
  5. pycharm 基本设置
  6. MyEclipse 中修改JSP模板
  7. 安装SAP Business One对软硬件有哪些要求
  8. boost::mp11::mp_compose相关用法的测试程序
  9. vue3的传送门teleport究竟有多神奇?suspense发起异步请求有多简约?
  10. 内置函数——filter和map
  11. SQL Server IS NULL语句使用举例
  12. knight tour java,Knight Tour Problem
  13. webpack随笔06-bulma
  14. Delft3d GRD及ENC问题
  15. 计算机断电无法启动不了系统,电脑突然断电后无法启动怎么回事
  16. linux命令中cd / 和 cd ~ 是什么意思?
  17. 中小尺寸OLED面板面临价格战,中国手机可捡便宜
  18. 行走的Linux——将ubuntu装入移动硬盘
  19. 新能源充电桩主板二代新上市,迎来充电桩产业新一轮发展
  20. Android 获取微信ua,微信小程序实现获取用户高清头像

热门文章

  1. 计算机英语常用词语,计算机英语 常见计算机英语词汇解释(1)
  2. 100578计算机基础II,什么是人工智能?人工智能专业主要课程有哪些
  3. 大学生计算机社团该办什么活动,大学生会计协会可以举办什么活动?
  4. int的极大值,无穷大
  5. 博图注册表删除方法_回收站文件删除怎么恢复?数据恢复还得靠它
  6. dh密钥协商算法c语言实现,Diffie-Hellman密钥协商算法-python实现
  7. JavaScript——异步编程
  8. python flask实战订餐系统微信小程序-00课程介绍及项目演示
  9. DSP TMS320C28x CPU 和指令设置参考【CPU】
  10. 广东省计算机水平考试证书有效期,软件设计师证书有效期是多久?永久有效吗?...