Jni使用基础(一)之简单介绍说明

来源:互联网 发布:python 字符串 大括号 编辑:程序博客网 时间:2024/05/16 23:50

 

JNI(Java Native Interface,JAVA原生接口

Jni 是一个协议,用来沟通java代码和外部的本地代码(c/c++)相互调用。

 

为什么要进行交互?

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

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

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

 

 

把源代码---->可执行文件

1.编译

2.链接 .exe

3.生成可执行文件

 

交叉编译:在一个操作系统的平台下(cpu平台下)去编译出来能够在另一个操作系统(cpu平台下运行代码)。

 

cygwin:是一个基于插件windows下的linux的模拟器。

 

 

Linux中:

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

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

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

交叉编译:

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

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

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

  x86结构 : 主要在台式机、笔记本上使用。如IntelAMDCPU 

若想在使用了基于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端定义一些vative方法,并将这些方法以C语言头文件的方式提供给C程序员

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

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

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

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

 

注意:在c语言中调用java,都是使用jni定义好了的接口函数(在ndk的android-ndk-r8-windows\android-ndk-r8\platforms\android-8\arch-arm\usr\include下的jni.h文件);