11.1基础知识

JNI(Java Native Interface,JAVA原生接口)

使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互。

问:为什么要进行交互?

|-  首先,Java语言提供的类库无法满足要求,且在数学运算,实时渲染的游戏上,音视频处理等方面上与C/C++相比效率稍低。

|-  然后,Java语言无法直接操作硬件,C/C++代码不仅能操作硬件而且还能发挥硬件最佳性能。

|-  接着,使用Java调用本地的C/C++代码所写的库,省去了重复开发的麻烦,并且可以利用很多开源的库提高程序效率。

C语言常见术语:

库函数:

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

|-  在Windows中C语言库函数中的中间代码都是以.obj为后缀的,Linux中是以 .o为后缀。

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

头文件:

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

   |-  头文件中定义的是库中所有函数的函数原型。而函数的具体实现则是在库文件中。

   |-  简单的说:头文件是给编译器用的,库文件是给连接器用的。

|-  在连接器连接程序时,会依据用户程序中导入的头文件,将对应的库函数导入到程序中。头文件以.h为后缀名。

函数库:

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

|-  静态库:在编译用户程序时会将其内使用的库函数连接到目标代码中,程序运行时不再需要静态库。使用静态库生成可执行文件比较大。

在Linux中:

|-  静态库命名一般为:lib+库名+.a

|-  如:libcxy.a 其中lib说明此文件是一个库文件,cxy是库的名称,.a说明是静态的。

|-  动态库命名一般为:lib+库名+.so 。.so说明是动态的。

交叉编译:

|-  将中间代码连接成当前计算机可执行的二进制程序时,连接程序会根据当前计算机的CPU、操作系统的类型来转换。

根据运行的设备的不同,可以将cpu分为:

|-  arm结构 :主要在移动手持、嵌入式设备上。

|-  x86结构 : 主要在台式机、笔记本上使用。如Intel和AMD的CPU 。

若想在使用了基于x86结构CPU的操作系统中编译出可以在基于arm结构CPU的操作系统上运行的代码,就必须使用交叉编译。

交叉编译:在一个平台下编译出在另一个平台中可以执行的二进制代码。Google提出的NDK就可以完成交叉编译的工作。

NDK全称:Native Development Kit 。

|-  NDK是一系列工具的集合,它有很多作用。

   |-  首先,NDK可以帮助开发者快速开发C(或C++)的动态库。

 |-  其次,NDK集成了交叉编译器。使用NDK,我们可以将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。

NDK工具必须在Linux下运行,它可以在linux环境下编译出可以在arm平台下运行的二进制库文件。

使用JNI技术,其实就是在Java程序中,调用C语言的函数库中提供的函数,来完成一些Java语言无法完成的任务。由于Java语言和C语言结构完全不相同,因此若想让它们二者交互,则需要制定一系列的规范。JNI就是这组规范,此时       Java只和JNI交互,而由JNI去和C语言交互。

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

|-  首先,Java程序员在Java端定义一些native方法,并将这些方法以C语言头文件的方式提供给C程序员。

|-  然后,C程序员使用C语言,来实现Java程序员提供的头文件中定义的函数。

|-  接着,C程序员将函数打包成一个库文件,并将库文件交给Java程序员。

|-  最后,Java程序员在Java程序中导入库文件,然后调用native方法。

在Java程序执行的时候,若在某个类中调用了native方法,则虚拟机会通过JNI来转调用库文件中的C语言代码。提示:C代码最终是在Linux进程中执行的,而不是在虚拟机中。

问题:在Android中可执行的文件,在Linux中一定可以执行吗? arm处理的linux

那为什么要说,NDK会交叉编译。

jni的一些基础知识和概念的更多相关文章

  1. C# 基础知识 (一).概念与思想篇

    在C#中有一些我自己认为比较独特的知识点,这些知识点是我经常使用的知识,但对它们的了解还是比较少的,所以通过查找资料学习,总结了这些独特的知识点并简单叙述,第一篇主要是一些概念和思想方面的知识.(后面 ...

  2. YUM源、磁盘基础知识 CDN概念

    第1章 YUM源 1.1 什么是yum源 Yellowdog Updater, Modified 一个基于RPM包管理的字符前端软件包管理器.能够从指定的服务器自动下载RPM包并且安装,可以处理依赖性 ...

  3. Java 多线程(一) 基础知识与概念

    多线程Multi-Thread 基础 线程概念 线程就是程序中单独顺序的流控制. 线程本身不能运行,它只能用于程序中. 说明:线程是程序内的顺序控制流,只能使用分配给程序的资源和环境. 进程 进程:执 ...

  4. JavaScript基础知识(概念、常量和变量)

    1.JavaScript概念 JavaScript是脚本语言; 编写之后,可以直接运行(缺失了编译的过程) 2.JavaScript发展 LiveScript    =>    JavaScri ...

  5. CSS基础知识(概念、块级元素、行内元素、选择器)

    1.CSS概念 全称为Cascading Style Sheets(层叠样式表),支持专有的文件 - 扩展名为".css" 作用:将HTML的结构(HTML标签即html)与样式( ...

  6. JNI由浅入深_4_JNI基础知识详解

    Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 ...

  7. DOM基础知识(概念、节点树、事件、Document)

    1.   DOM概念 全称为 Document Object Model,译为文档对象模型 D:文档 - DOM将HTML页面解析为一个文档 —> document对象 O:对象 - DOM将H ...

  8. java基础知识-基本概念

    1.1 java语言有哪些优点? 1.java语言为纯面向对象的语言. 2.平台无关性.java语言的优点便是“一次编译,到处执行”.编译后的程序不会被平台所约束,因此java语言有很好的移植性. 3 ...

  9. JavaScript基础知识-基本概念

    typeof操作符 typeof 操作符返回一个字符串,表示未经计算的操作数的类型. // 数值 typeof 37 === 'number'; typeof 3.14 === 'number'; t ...

随机推荐

  1. long的变量后面没有L加会有什么后果

    不加L的话,默认就是int型了. 当给long赋值一个超过int范围的值的时候,会出问题. java中对字面的数值是以int的形式来表示的  例如:long l= 6553555522222 报错:T ...

  2. OpenResty 扩展库(二)lua-resty-template

    Lua和OpenResty的模板引擎(HTML) 模板语法 您可以在模板中使用以下标签: {{expression}},写入表达式的结果 - html转义 {*expression*},写入表达结果 ...

  3. Selenium学习(Python)

    #从Selenium中导入Webdriver类,该类中定义了selenium支持的浏览器 # webdriver.Firefox # webdriver.FirefoxProfile # webdri ...

  4. html5 canvas显示文字(写上5个字,纪念我那刚刚逝去的爱情)

    <script type="text/javascript"> window.addEventListener('load',eventWindowLoaded,fal ...

  5. 【整理】Git相关资料

    http://book.51cto.com/art/201107/278731.htm http://book.51cto.com/art/201107/278828.htm  

  6. gulp.js 的安装以及使用

    首先:电脑需要安装 Node.js 一个大绿色的安装按钮,点击就可以. 但还是推荐,点击download选中一款适合电脑配置的版本. Node安装过程,就是下一步 and 下一步~~ 测试手否安装成功 ...

  7. 鼠标样式 cursor 全总结

    本文地址:https://www.cnblogs.com/veinyin/p/10752805.html  最常用的 key  pointer   cursor: key; // 除了pointer, ...

  8. !DOCTYPE 声明

    !DOCTYPE 声明的作用: <!DOCTYPE html> 当使用 position 属性进行对齐时,请始终包含 !DOCTYPE 声明!如果省略,则会在 IE 浏览器中产生奇怪的结果 ...

  9. DSO 优化代码中的 Schur Complement

    接上一篇博客<直接法光度误差导数推导>,DSO 代码中 CoarseInitializer::trackFrame 目的是优化两帧(ref frame 和 new frame)之间的相对状 ...

  10. pytorch函数之torch.normal()

    Returns a Tensor of random numbers drawn from separate normal distributions who’s mean and standard ...