使用Android开发App不只是使用Java,还可以使用C/C++,这就是我们要使用NDK的目的 -- 为了能让Java识别所要调用的C/C++。

第二章 NDK配置与简单使用

前言

对于有过开发跨语言经历的朋友而言,使用不同语言同时在一个项目中使用不算什么奇怪的事情,

甚至在编写C/C++程序时,有时为了各种原因用到(一般是嵌套或者调用)asm(汇编),

从形式上来看 这是跨语言的表现,但是实质上来说,此种做法是利用了编译器的可识别性和可编译性,也就是说C/C++的编译器本身就能够编译asm的内容。

众所周知,JVM是不能直接编译和运行C/C++的,因此,NDK的诞生就是为了解决这个问题。

其实NDK就是运用了早已存在的JNI技术,只不过增加了不同硬件平台的编译器(arm,x86,amd等),使得运行在这些硬件平台的软件能够调用C/C++程序。

获取NDK

1、选择正确的系统类型和对应的版本

首先你得知道你的硬件类型和系统位数,

系统位数:

windows:电脑->属性。。。)

Linux: uname -m(不带*_64输出的就是32)

硬件类型:

查看你的PC的CPU类型

windows可以查看管理工具

Linux 执行 lshw 或者查看 /proc/cpuinfo

笔者下载的NDK包:android-ndk32-r10-linux-x86.tar.bz2 (可以看出是:Linux 32位 x86)

2、安装压缩包

解压: tar jxvf android-ndk32-r10-linux-x86.tar.bz2 -C $path 到任意路径(建议放到 /opt 或者eclipse的安装目录附近),解压后目录名称可以自定义(维持原样亦可)

为了在任意路径下能够使用NDK中的命令,需要将NDK解压后的路径加入到环境变量PATH中,同时为了修改方便将这个路径定义为一个变量(在/etc/profile文件的最后添加),即:

export ANDROID_NDK_PATH=$apth/android-ndk-r10

export PATH=$PATH:$ANDROID_NDK_PATH:$ANDROID_SDK_PATH/tools

测试安装成功与否

进入NDK的解压目录:cd $ANDROID_NDK_PATH/samples/hello-jni

执行:ndk-build

若输出:

...

[x86] Gdbserver      : [x86-4.6] libs/x86/gdbserver
[x86] Gdbsetup       : libs/x86/gdb.setup
[x86] Install        : libhello-jni.so => libs/x86/libhello-jni.so

...
则说明安装成功

后记:

默认情况下ndk会交叉编译所有支持的硬件平台,也就是jni目录下的Application.mk 文件中是 APP_ABI := all
如果仅需要支持某一种类型的,比如 x86 ,则只需要 修改其值为 APP_ABI := x86 

其余的还有:armeabi-v7a,armeabi,mips

如何使新建工程,能够被正确编译,模板格式可以参考hello-jni这个目录结构,还有需要配置jni目录下的Android.mk与Application.mk(都是文本类文件)

小结

本章介绍了NDK的安装配置和基本测试,其最重要的目的是使交叉编译以适应移动平台的不同硬件。

第二章:Android之NDK配置与简单使用相关推荐

  1. 浅入浅出 Android 安全:第二章 Android Linux 内核层安全

    第二章 Android Linux 内核层安全 来源:Yury Zhauniarovich | Publications 译者:飞龙 协议:CC BY-NC-SA 4.0 作为最广为人知的开源项目之一 ...

  2. lua-protobuf 新手入门篇-第二章.Unity lua-protobuf 环境配置

    第一章.编译lua-protobuf支持库(Windows插件-Win10编译) 第二章.Unity & lua-protobuf 环境配置 第三章.二进制proto读取功能,与,lua-pr ...

  3. 第二章 Android内核和驱动程序(转)

    这一章我们来介绍Android系统的核心部分-Android内核.我们说Android系统是基于Linux系统的,最根本的原因就在于Android采用了Linux内核. 2.1 Android内核特性 ...

  4. Android之NDK开发的简单实例

    NDK全称为Native Development Kit,是本地开发工具集.在Android开发中,有时为了能更好的重用以前的C/C++的代码,需要将这些代码编译成相应的so,然后通地JNI以供上层J ...

  5. spring boot @value_spring+vue全栈开发实战-第二章Spring Boot 基础配置-笔记0302-2020

    Spring Boot 基础配置 1. Web 容器配置 2.Properties 配置 3.类型安全配置属性 1. Web 容器配置 a.常规配置 在 Spring Boot 项 目 中,可以内置 ...

  6. WindowsServer实训项目——第二章:安装和配置WindowsServer

    一.实训目的 1.熟练使用VMware 2.掌握VMware的详细配置与管理 3.掌握使用VMware进行Windows Server网络操作系统的安装 二.项目背景 公司新购进一台服务器,硬盘空间为 ...

  7. 第二章 ELKstack部署及配置

    一:elasticsearch部署: 1.1:环境初始化: 最小化安装 Centos 7.2 x86_64操作系统的虚拟机,vcpu 2,内存4G或更多,操作系统盘50G,主机名设置规则为linux- ...

  8. Java语言程序设计(基础篇) 第二章

    第二章 基本程序设计 2.2 编写简单的程序 1.变量名尽量选择描述性的名字(descriptive name). 2.实数(即带小数点的数字)在计算机中使用一种浮点的方法来表示.因此,实数也称为浮点 ...

  9. PD3.1详解 第二章(EPR)

    PD3.1详解 第二章(EPR) 第一章节简单的介绍了如何进入EPR模式,这里主要逐步说明具体的细节: 一. 如果需要进入EPR 那么所用的线必须要满要求,我们知道PD3.0中我们必须要有emark线 ...

最新文章

  1. postfix+mysql 发件服务
  2. SAP PM 初级系列5 - 工作中心相关的配置
  3. JNDI学习总结(1)——JNDI入门简介
  4. Python探索记(01)——HelloWorld及Python的注释
  5. 北哥大话Yii2缓存机制 - File缓存
  6. php开启mysqlnd,如何启用mysqlnd的PHP?
  7. c语言程序输入n个数字排序,输入n个数字然后进行排序,用C语言编写。注意是n个数啊,不是确定的个数。...
  8. ES5-19 变量声命周期、垃圾回收原理、arguments
  9. ASP.NET AJAX 学习笔记
  10. ViewController的生命周期你真的懂了吗?
  11. 读取SAE J1939协议数据流
  12. 微信小程序05 事件绑定与事件传参
  13. 激光雷达障碍物检测与追踪实战——基于欧几里德聚类的激光雷达障碍物检测
  14. 私域流量客服社群运营员工工作绩效表格方案计划手册指南宝典
  15. HTML的relative与absolute区别
  16. 新建销售群开场语句_销售会议开场白台词
  17. DIV+CSS+JavaScript技术制作网页(旅游主题网页设计与制作)云南大理 (1)
  18. S32K144调试记录(二)
  19. - **体感试衣镜等功能代码工程分享**
  20. 锂电池电量百分比计算_锂离子电池容量计算之电压法

热门文章

  1. 支付系统中的设计模式01:初始需求
  2. 6.Cordova 的环境搭建
  3. VSCode插件、快捷键及代码调试技巧
  4. 【养生保健:脂肪肝发生前的七种征兆】
  5. 浅谈C#可变参数params
  6. mysql 中国时间转成美国时间_中国与美国日期转换
  7. Bootstrap 3之美01-下载并引入页面
  8. 运放如何产生方波信号
  9. 父亲故意灌醉即将上大学的17岁亲生女儿, 后来说了这样一段话
  10. 唯美的古风句子——喜欢