JNI/NDK入门指南之正确姿势了解JNI和NDK

Android JNI/NDK入门指南目录

JNI/NDK入门指南之正确姿势了解JNI和NDK
JNI/NDK入门指南之JavaVM和JNIEnv
JNI/NDK入门指南之JNI数据类型,描述符详解
JNI/NDK入门指南之jobject和jclass
JNI/NDK入门指南之javah和javap的使用和集成
JNI/NDK入门指南之Eclipse集成NDK开发环境并使用
JNI/NDK入门指南之JNI动/静态注册全分析
JNI/NDK入门指南之JNI字符串处理
JNI/NDK入门指南之JNI访问数组
JNI/NDK入门指南之C/C++通过JNI访问Java实例属性和类静态属性
JNI/NDK入门指南之C/C++通过JNI访问Java实例方法和类静态方法
JNI/NDK入门指南之JNI异常处理
JNI/NDK入门指南之JNI多线程回调Java方法
JNI/NDK入门指南之正确姿势了解,使用,管理,缓存JNI引用
JNI/NDK入门指南之调用Java构造方法和父类实例方法
JNI/NDK入门指南之C/C++结构体和Java对象转换方式一
JNI/NDK入门指南之C/C++结构体和Java对象转换方式二


引言

   随着Android生态的发展,越来越多的行业开始使用Android操作系统,这就造就了对Android设备的应用性能和安全要求越来越高,随之而来的对JNI/NDK开发的需求也越来越大。虽然网上或者很多书籍都有关于此方面的讲解,但是都是上来直奔主题说怎么使用JNI/NDK,而没有将啥是JNI和NDK讲解清楚。所以导致很多读者虽然会用,但是依然没有搞明白JNI/DNK的基本理论知识,那么今天我们就来对JNI/NDK详细掰扯掰扯它们之间的联系和区别。


一. 细说JNI

1.1 JNI是什么?

   JNI(Java Native Interface,JAVA原生接口)。JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行互操作。通俗一点讲就是在 Java代码 里调用 C/C++等语言的代码 或 C/C++代码调用 Java 代码。
注意:JNI(Java Native Interface)是SUN定义的一套标准接口,如Dalvik, Apache Harmony
项目…等 Java虚拟机,都会实现 JNI 接口,供本地(C/C++)应用与Java VM互调,即JNI 最重要的好处是它没有对底层 Java 虚拟机的实现施加任何限制。所以JNI是Java语言的特点,和Android没有关系。

1.2 JNI优点(即为啥要用JNI)

  • 首先,Java语言提供的类库无法满足要求,且在数学运算,实时渲染的游戏上,音视频处理等方面上与C/C++相比效率稍低。
  • 然后,Java语言无法直接操作硬件,C/C++代码不仅能操作硬件而且还能发挥硬件最佳性能。
  • 接着,使用Java调用本地的C/C++代码所写的库,省去了重复开发的麻烦,并且可以利用很多开源的库提高程序效率。

通过对上面的几点的总结,可以归纳出一句话就是规避Java语言的弱点,然后利用C/C++的优点。

1.3 JNI缺点

   任何事情都是由两面性的,所以JNI也不例外,所以在决定使用 JNI之前,我想各位一定要了解JNI那些缺点,如果能接受和容纳那就可以放心大胆的使用了。

  • 使用JNI细小的错误都能让这个JVM不稳定,并且这些错误很难再现和调试

  • 使用JNI的应用失去了JAVA本身提供的不同平台的可移植性。

  • JNI 框架不提供自动的垃圾回收机制,所以这部分代码要考虑内存的释放

1.4 JNI技术的实现原理

   JNI技术分为两部分:Java端和C语言端。且以Java端为主导。

  • 首先,Java程序员在Java端定义一些native方法,并将这些方法以C语言头文件的方式提供给C程序员。
  • 然后,C程序员使用C语言,来实现Java程序员提供的头文件中定义的函数。
  • 接着,C程序员将函数打包成一个库文件,并将库文件交给Java程序员。
  • 最后,Java程序员在Java程序中导入库文件,然后调用native方法。

在Java程序执行的时候,若在某个类中调用了native方法,则虚拟机会通过JNI来转调用库文件中的C语言代码

1.5 JNI使用步骤简介

   虽然本篇章主要是介绍JNI/NDK的理论知识,但是还是顺带简介一下在JAVA开发中怎么使用JNI,步骤如下:

  • 在Java中声明Native方法(即需要调用的本地方法)
  • 编译上述 Java源文件javac(得到 .class文件)
  • 通过 javah 命令导出JNI的头文件(.h文件)
  • 使用 Java需要交互的本地代码 实现在 Java中声明的Native方法
  • 如 Java 需要与 C++ 交互,那么就用C++实现 Java的Native方法
  • 编译.so库文件
  • 通过Java命令执行 Java程序,最终实现Java调用本地代码

二. 细说NDK

2.1 NDK是什么

   NDK全称:Native Development Kit,是Android的妈咪谷歌为我们提供的一套开发工具。正所谓谷歌出品,必属精品,NDK是一系列工具的集合,它有很多作用。

  • 首先,NDK可以帮助开发者快速开发C(或C++)的动态库。
  • 其次,NDK集成了交叉编译器。使用NDK,我们可以将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。

NDK的出现为我们在Android开发中使用JNI提供了非常方便的工具套间,这里不得不给谷歌一个赞。

2.2 NDK特点

   NDK具有如下图示的特点,这边我借鉴了Android:JNI 与 NDK到底是什么?(含实例教学)的总结,这里我就不再进行自我总结了,因为他的总结确实不错。


3. 补充知识点,C/C++语言常见术语

   提到了JNI,所以不得不对一些C/C++里面常见的术语进行一些基本的解释,这样对于更加深入的了解JNI是必不可少的。

3.1 库函数

   为了代码重用,在C语言中提供了一些常用的、用于执行一些标准任务(如输入/出)的函数,这些函数事先被编译,并生成目标代码,然后将生成的目标代码打包成一个库文件,以供再次使用。 库文件中的函数被称为库函数,库文件被称为函数库。

  • 在Windows中C语言库函数中的中间代码都是以.obj为后缀的。
  • Linux中是以 .o为后缀。
    提示:单个目标代码是无法直接执行的,目标代码在运行之前需要使用连接程序将目标代码和其他库函数连接在一起后生成可执行的文件。 Windows下.dll的文件 , linux下 .so .a的文件.。

3.2 头文件

   头文件中存放的是对某个库中所定义的函数、宏(define)、类型、全局变量等进行声明,它类似于一份仓库清单。若用户程序中需要使用某个库中的函数,则只需要将该库所对应的头文件include到程序中即可。

  • 头文件中定义的是库中所有函数的函数原型。而函数的具体实现则是在库文件中。
  • 简单的说:头文件是给编译器用的,库文件是给连接器用的。
  • 在连接器连接程序时,会依据用户程序中导入的头文件,将对应的库函数导入到程序中。头文件以.h为后缀名。

3.3 函数库

  函数库一般分为动态库和静态库两种。

  • 动态库:在编译用户程序时不会将用户程序内使用的库函数连接到用户程序的目标代码中,只有在运行时,且用户程序执行到相关函数时才会调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。
  • 静态库:在编译用户程序时会将其内使用的库函数连接到目标代码中,程序运行时不再需要静态库。使用静态库生成可执行文件比较大。

在Linux中:

  • 静态库命名一般为:lib+库名+.a 。
  • 如:libcxy.a 其中lib说明此文件是一个库文件,cxy是库的名称,.a说明是静态的。
  • 动态库命名一般为:lib+库名+.so 。.so说明是动态的。

3.4 交叉编译

   检查编译是指将中间代码连接成当前计算机可执行的二进制程序时,连接程序会根据当前计算机的CPU、操作系统的类型来转换。
根据运行的设备的不同,可以将cpu分为:

  • arm结构 :主要在移动手持、嵌入式设备上。
  • x86结构 : 主要在台式机、笔记本上使用。如Intel和AMD的CPU 。

若想在使用了基于x86结构CPU的操作系统中编译出可以在基于arm结构CPU的操作系统上运行的代码,就必须使用交叉编译。
交叉编译:在一个平台下编译出在另一个平台中可以执行的二进制代码。Google提供的NDK就可以完成交叉编译的工作。


总结

   通过前面详细的讲解,我想各位读者应该对JNI/NDK有一个清晰的认识了,如果还不清晰那只能说臣妾真的做的不到了(开玩笑了)。下面让我在最后用一句话总结那就是JNI是一种Java开发中使用到的技术手段,而NDK则是Android妈咪谷歌提供的一种使用JNI的开发工具套件,这样总结下来是不是so easy了。青山不改绿水长流,各位江湖见!

JNI/NDK入门指南之正确姿势了解JNI和NDK相关推荐

  1. Android SELinux开发入门指南之正确姿势解决访问data目录权限问题

      Android SELinux开发入门指南之正确姿势解决访问data目录权限问题 Android SELinux开发多场景实战指南目录: Android SELinux开发入门指南之SELinux ...

  2. JNI/NDK入门指南之jobject和jclass

          JNI/NDK入门指南之jobject和jclass Android JNI/NDK入门指南目录 JNI/NDK入门指南之正确姿势了解JNI和NDK JNI/NDK入门指南之JavaVM和 ...

  3. android -------- NDK 入门指南

    NDK介绍 原生开发工具包 (NDK) 是一组可让您在 Android 应用中利用 C 和 C++ 代码的工具. 可用以从您自己的源代码构建,或者利用现有的预构建库. NDK 不适用于大多数初学的 A ...

  4. 这才是简单快速入门Python的正确姿势!

    作者/分享人:张杨,热爱技术分享,活跃于今日头条和腾讯课堂,开设的<Python3网络爬虫入门>.<Python开发课程>等专栏受到好评. 一.前言 强烈建议:请在电脑的陪同下 ...

  5. 入门Promise的正确姿势

    Promise是异步编程的一种解决方案,从语法上说,Promise是一个对象,从它可以获取异步操作的消息. Promise的基本用法 Promise构造函数接受一个函数作为参数,该函数的两个参数分别是 ...

  6. Android SELinux开发入门指南之如何增加Native Binder Service权限

      Android SELinux开发入门指南之如何增加Native Binder Service权限 Android SELinux开发多场景实战指南目录: Android SELinux开发入门指 ...

  7. Android SELinux开发入门指南之如何增加Java Binder Service权限

      Android SELinux开发入门指南之如何增加Java Binder Service权限 Android SELinux开发多场景实战指南目录: Android SELinux开发入门指南之 ...

  8. 正确姿势临时和永久开启关闭Android的SELinux

          正确姿势临时和永久关闭Android的SELinux Android SELinux开发多场景实战指南目录: Android SELinux开发入门指南之SELinux基础知识 Andro ...

  9. 快速入门Web前端开发的正确姿势

    入门标准很简单,就一条:达到能参与 Web 前端实际项目的开发水平.请注意,是实际项目,这就需要了解如今的实际项目开发都用了哪些技术栈.HTML/CSS/JavaScript 这三大基础技术栈肯定是需 ...

  10. JNI/NDK开发指南(八)——调用构造方法和父类实例方法

    转载请注明出处:http://blog.csdn.net/xyang81/article/details/44002089 在第6章我们学习到了在Native层如何调用Java静态方法和实例方法,其中 ...

最新文章

  1. 简易的阻尼滚动条的插件
  2. 基于HBASE的并行计算架构之rowkey设计篇
  3. 621. Task Scheduler 任务调度器
  4. 牛客练习赛43 Tachibana Kanade Loves Probability(快速幂)
  5. 【leetcode】Combinations (middle)
  6. 上网课的心得体会1000字_网络学习心得体会 (1000字)
  7. excel range 判断日期型_EXCEL常用函数二
  8. python动态导入模块_Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析...
  9. 引用com.sencha.gxt.ui.GXT加载错误解决方案
  10. Linux运维第二课----Linux发展史、环境准备
  11. delphi2007 打开项目时,突然报错,提示microsoft.net borland 报错
  12. Ant Design Vue - 修改<Table>表格组件默认的暂无数据图标(自定义表格空数据状态图片)
  13. matlab实现输出的几种方式
  14. 按住滑块 拖拽验证html5,【原生】JavaScript 实现滑动拖动验证
  15. 一张图读懂中国产业链的变化与机会
  16. 游戏测试(面试可用)
  17. 解决网页内容无法复制的方法
  18. [教程] 如何复活一个完全死机的联发科设备
  19. [案例]信息巨头Carfax如何打造数据产品
  20. Ubuntu18.04安装carla0.9.9 UE4.24踩坑版

热门文章

  1. 当今计算机的排名,目前电脑处理器排行榜(2020处理器性能排名对比)
  2. 沉迷于网络的人数_一个沉迷于追求的搜索者
  3. [转载]关于雷电防御
  4. [《雪的散文诗》小个子的诗集]2012年8月28日
  5. 语音识别(ASR)论文优选:自监督学习Self-Supervised Learning for speech recognition with Intermediate layer supervisi
  6. eleme饿了么vue项目随笔,随时更新,想到哪里写到哪里比较凌乱一直更新
  7. 要读的书---培根说:历史使人明智,诗词使人巧慧,算学使人精密,哲理使人深刻,伦理学人庄重,逻辑修辞使人善辩。...
  8. 《生死疲劳》读书有感
  9. 艳照门事件发酵 谷歌称已删除数万张照片
  10. 市场细分与目标群体定位