什么是 NDK?

Android NDK 是一套可以让开发者在安卓应用开发中使用 C/C++ 实现特定模块的工具集,不是所有应用都需要用到,但是正确地使用可以有效提高应用运行效率和安全性。

为什么要在安卓开发中使用 NDK?

  • 游戏引擎使用 Native 的 C/C++ 库,便于跨平台移植,开发游戏应用,使用NDK可以直接调用这些库
  • 通用应用开发中,像加密、解密以及其他一些核心算法等等都可以用 C/C++ 实现,使用NDK编译为动态库后,Java 可以通过Jni 调用。提高性能和安全性。
  • 移植一些通用的 C/C++ 工具到安卓平台,以便我们的应用能使用这些 Utilities, 比如 Curl 等。
  • NDK 支持用纯 C++ 开发安卓应用,使用 OpenGL 来创建交互界面。

如何安装NDK

在安装好 安卓开发环境 后,参考官方说明进行 NDK的下载配置 。本文着重讲如何用 NDK 移植 C/C++ 的项目到安卓系统,至于在安卓应用项目中使用 NDK 进行开发,包括使用纯 C++ 进行开发和通过 Jni 和 Java 代码配合的开发网上已经有很多朋友的总结。

NDK 移植 C/C++ 项目到安卓平台

安卓系统也是一个基于 ARM 架构的嵌入式系统,其内核是 Linux 操作系统,而且 Google 支持从 NDK 中导出独立的交叉编译工具链。如此我们就可以参考嵌入式开发和移植的经验。这篇文章移植 curl 库到安卓平台,然后我们用一个使用 curl 的二进制可执行文件在安卓系统中进行测试。

  • 从 NDK 中导出 ``standalone` 的交叉编译工具链

    •  /usr/local/android-ndk-r9d 需要被替换为 NDK 的实际路径。
    • make-standalone-toolchain.sh 是 Google 官方提供的导出交叉编译工具链的脚本
    •  --platform=android-19 指定导出的 API,19 代表安卓系统版本 4.4.2
    • 默认情况下,导出的是 ARM 架构的工具链。如果需要 X86 后者 Mips 架构的,需要加上 --arch=x86 或者 --arch=mips
    • 导出的压缩包将会位于 /tmp/ndk/TOOL_CHAIN_NAME.tar.bz2
/usr/local/android-ndk-r9d/build/tools/make-standalone-toolchain.sh --platform=android-19
  • 找到导出的压缩包,解压到自己定义的目录下
mkdir Android19NDK48
tar -xjvf /tmp/ndk-rwang/arm-linux-androideabi-4.8.tar.bz2 -C ~/Android19NDK48/
  • 将解压后 toolchain 所在的路径添加到环境变量中并重新加载环境配置文件。

  • 下载 CurL 的源代码压缩包,并解压缩,然后进入 src 目录:

tar -xzvf curl-7.36.0.tar.gz -C CURLSrc/
cd CURLSrc/
  • 运行 configure 生成 makefile 文件,配置参数说明参见 NDK交叉编译需要注意的地方
./configure CC=arm-linux-androideabi-gcc --host=arm-linux-androideabi CFLAGS='-march=armv7-a -mfloat-abi=softfp' LDFLAGS='-Wl,--fix-cortex-a8'
  • 创建一个 C++ 源文件,添加 curl 的测试代码
#include <stdio.h>
#include <curl/curl.h>int main()
{CURL *curl;CURLcode res;FILE *fp;if ((fp = fopen("test.txt", "w")) == NULL)return 1;struct curl_slist *headers = NULL;headers = curl_slist_append(headers, "Accept: Agent-007");curl = curl_easy_init();if (curl){curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);curl_easy_setopt(curl, CURLOPT_URL,"http://www.baidu.com");curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); curl_easy_setopt(curl, CURLOPT_HEADERDATA, fp); res = curl_easy_perform(curl); if (res != 0) {curl_slist_free_all(headers);curl_easy_cleanup(curl);}fclose(fp);return 0;}
}
  • 创建 makefile 文件,测试项目只有一个源文件,使用 makefile 主要是为了管理编译参数方便
CC= arm-linux-androideabi-g++
CFLAGS='-march=armv7-a -mfloat-abi=softfp'
LDFLAGS='-Wl,--fix-cortex-a8'INCLUDES+= -I.
INCLUDES+= -I/home/rwang/Android19NDK48/sysroot/usr/include
LIBS+= -L/home/rwang/Android19NDK48/sysroot/usr/lib -lcurl -lzsrc := $(shell ls *.cpp)
objs := $(patsubst %.cpp,%.o,$(src))curlTestOnAndroid : $(objs)
$(CC) -o $@ $^ $(LIBS)%.o: %.cpp
$(CC) -c $< -o $@ $(INCLUDES)clean :-rm curlTestOnAndroid $(objs)
  • 执行 make 命令进行编译之前,我们需要把之前移植的 curl 静态库放到交叉编译工具链的 lib 目录下,头文件拷贝到相应的 include 目录下,具体可以参考上面 makefile 里面的信息。拷贝后,运行 make

  • 将编译好的二进制文件通过 adb push 命令上传到 ARM 架构的安卓设备,比如安卓手机,通过 adb shell 进入安卓系统的终端,赋权后运行查看结果。

至此,我们完成了使用基于NDK的交叉编译器进行安卓平台 C/C++ 开发的流程。NDK 对 C++ STL 的支持是有限的,在安卓应用开发中使用 C++ 源代码的时候,Application.mk 的设置需要参考 这篇文章

使用 Android NDK 的交叉编译工具链移植 C/C++ 项目到安卓平台相关推荐

  1. Android NDK 导出独立工具链

    传统方式调试 NDK 开发的程序比较麻烦,先要编译成 JNI,又要导出 java接口,还要再写一个 java 工程,改一个地方又要连续改几处,这样效率是很低的.最频繁使用的关键工作路径(编译/调试环节 ...

  2. java交叉编译安卓可用,Android开发实践:Android交叉编译工具链的使用

    前面2篇文章分别介绍了Android NDK编译的命令行参数,以及如何在任意目录使用Android.mk来编译本地c/c++代码,Andriod.mk和ndk-build只不过是Android官方提供 ...

  3. ubuntu 编译android .img_全网可用交叉编译工具链大全

    本文首次发表在 全网可用交叉编译工具链大全 嵌入式系统业界前辈 @comcat 说: 交叉编译工具链 (Toolchain) 是整个嵌入式软件工业的基础. 是的,交叉编译工具链 是学习处理器指令集.汇 ...

  4. ARM交叉编译工具链分类说明

    为什么要用交叉编译器? 交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程序,编译得到的程 ...

  5. Ubuntu18.04安装交叉编译工具链gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf

    只是记录过程 安装交叉编译工具链arm-linux-gnueabihf https://releases.linaro.org/components/toolchain/binaries/latest ...

  6. 各种交叉编译工具链的区别

    目录 1 命名规则 2 实例 2.1 arm-none-eabi-gcc 2.2 arm-none-linux-gnueabi-gcc 2.3 arm-eabi-gcc 2.4 armcc 2.5 a ...

  7. 【linux系统如何安装arm交叉编译工具链】

    文章目录 前言 一.arm交叉编译器介绍 命名规则 具体编译器 二.Arm GNU Toolchain安装 总结 前言 本文简要介绍arm交叉编译器及工具链的安装方法 一.arm交叉编译器介绍 命名规 ...

  8. 利用Crosstool-ng 1.3.3 生成powerpc交叉编译工具链

    有人问起建立交叉编译环境,以前用过ELDK或者crosstool来生成PowerPC405的交叉编译工具链.以前也写过类似的Blog(见参考4),做起来不是很麻烦,但是crosstool做生成的gcc ...

  9. ARM交叉编译工具链gnueabi、none-eabi、arm-eabi等命名的区别

    命名规则 交叉编译工具链的命名规则为:arch [-vendor] [-os] [-(gnu)eabi] arch – 体系架构,如ARM,MIPS vendor – 工具链提供商 os – 目标操作 ...

最新文章

  1. Python os模块常用命令
  2. FreeBSD5.3下安装Apache+PHP+MySQL+Tomcat
  3. springmvc+log4j操作日志记录,详细配置
  4. initrd镜像文件的作用与制作
  5. 概率机器人总结——(扩展)卡尔曼滤波先实践再推导
  6. adb 连接某个wifi_一加7 Pro全局强制开启90Hz刷新率的办法(附ADB文件下载)
  7. 使用异或运算交换两个任意类型变量
  8. 上科大提出:对抗神经网络 动态人像系统SofGAN!
  9. InsecureRequestWarning: Unverified HTTPS request is being made.解决方法
  10. Python制作含微软雅黑字体的图片报错,中文字体报错可用类似方式处理
  11. 数据库五种约束以及添加方法
  12. MATLAB信号的带宽估计及求带宽(3dB,90%带宽)
  13. 可汗学院公开课:统计学笔记——基础知识、二项及泊松分布 、大数定律、正态分布
  14. DispatchQueue (SwiftUI Dispatch 中文手册)
  15. 微信公众号html在线编辑器,【微信公众平台工具开发】雷人微信网页编辑器
  16. 深度学习 Day 8——解决GIF生成错误以及有关GAN过程问题
  17. 斐波那契问题——上台阶问题
  18. iPhone X(iOS 14.6)在Win 10上使用iRemoval PRO v5.1.2进行越狱
  19. 导数用于判断函数的单调性,凹凸性,极值
  20. 图灵计算机科学的奠基人英文,阿兰.图灵被认为是计算机科学的奠基人,他的主要贡献是:...

热门文章

  1. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 注入工具的 main 函数分析 )
  2. 【Android 内存优化】Bitmap 图像尺寸缩小 ( 设置 Options 参数 | inJustDecodeBounds | inSampleSize | 工具类实现 )
  3. 【Android 应用开发】Android开发 使用 adb logcat 显示 Android 日志
  4. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解
  5. 那些做的“不够好”的父母,他们可能已经做到了自己的100分
  6. java中的访问修饰符 (2013-10-11-163 写的日志迁移
  7. 一个可视化的retrospective网站
  8. 【转】Linux上安装使用SSH(ubunturedhat)
  9. fork()与pid
  10. 归并排序之——二路归并(c/c++)