版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料1.1 应用Java JNI接口创建带有本地方法的Java应用实例1.1.1 JNI相关实现技术1、JNI(1)JNI是Java Native Interface的缩写,中文为JAVA本地调用从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写(如C和C+等)的代码进行交互;JNI是JDK的一部分,用于为Java提供一个本地代码的接口。(2)本地方法所谓的本地方法是相对于运行在Java虚拟机“沙箱”中的Java程序而言的,特指直接运行在操作系统之上,与操
2、作系统直接交互的程序代码可以为C/C+、ASM汇编或者其它语言的代码。JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。使用Java虚拟机运行时java.lang.Runtime类中的exec()方法调用外部进程不属于JNI的范畴。2、为什么使用JNI(Java本地接口)JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操
3、作的一种方法就是JNI。(1)开发人员可以利用JNI技术处理Java语言无法处理的任务比如:标准的Java类库可能不支持的程序所需的特性、或许已经有了一个用其他语言写成的库或程序,但又希望在Java程序中使用它或者可能需要用底层语言实现对操作系统、硬件设备的直接访问。(2)Java及基于Java的J2EE擅长于企业应用开发,而在实时应用和桌面应用领域有不足JNI正是为Java和其他语言之间的互操作打开了方便之门,访问本地操作系统中的图形界面的资源VC+的程序窗口要比Java Swing窗口漂亮!(3)Java程序的性能问题由于Java是一种介于解释型和编译型之间的语言,其对内存的管理是通过JV
4、M虚拟机来实现的,同样的程序,如果用编译型语言C来实现,其运行速度一般要比Java快得多。因此,提高Java的性能就显得十分重要。当然,通过在程序设计的方法和模式选择方面进行优化能够在一定的程度上改善Java程序的性能。但是由于算法和设计模式的优化是通用的,对Java有效的优化算法和设计模式,对其他编译语言也基本适用,因此不能从根本上改变Java程序与编译型语言在执行效率方面的差异。3、但JNI是否和Sun在Java技术中所倡导的“Write Once, Run Everywhere”的宗旨相背离?(1)主张采用纯Java的人们通常反对本地化代码的使用认为JNI技术会影响程序的可移植性和安全性
5、或者在Java程序执行的过程中调用cc+程序只是对过去混合编程技术的简单扩展,其实际目的是为了充分利用大量原有的c程序库。(2)我们也需要反思“平台无关”所带来的代价因为采用JNI技术只是针对一些严重影响Java性能的代码段。该部分可能只占源程序的极少部分,所以几乎可以不考虑该部分代码在主流平台之间移植的工作量。4、在什么时候使用JNI(1)应用需要调用Java语言不支持的依赖于系统平台的特性(监控CPU及操作系统中的进程等)。(2)为了整合一些遗留下来的非java语言开发的系统(保护历史投资和为了缩短开发周期、降低开发成本,可能就需要考虑采用JNI调用这些旧模块)。(3)为了创建一个小的省时
6、应用不得不采用低级语言(实时性要求高的应用场合,以“半编译”形态出现的Java语言是难以胜任的,这时借助运行性能更佳的本地程序来完成这些关键任务更为合理)。熟悉基于Oracle数据库管理系统开发应用的开发人员应该不会陌生,Oracle提供的JDBC驱动程序分为两套,采用OCI(Oracle Call Interface)的本地调用类库和纯Java实现的驱动程序类库。采用前者的执行性能更好,而且因为Oracle在主流操作系统平台上提供的供调用的本地类库的调用形式完全相同,因此对应用开发人员而言,使用这套基于JNI原理的驱动程序类库几乎感受不到整个系统的可移植性受到了影响(当然,局限于Oracle
7、数据库环境下)。5、JNI技术架构C SideJNIJava SideExceptionsClassesVMFunctionsLibraries因此,应用JNI技术可以使Java开发人员在Java程序中访问本地方法;同样,JNI也允许在本地方法中访问Java应用中的方法。6、开发应用调用Java方法示意图(1)工作原理示意图C语言应用Java应用Java类库Java虚拟机Java方法调用调用(2)在Java程序中调用其它语言编写的程序的必要条件1) 被调用的函数和方法被封装在标准的动态链接库中,在开发被调用的动态链接库的过程中,要引入类似于jni.h(但由于jni.h只是针对C语言的),然后实
8、现利用javah生成的头文件中定义的函数即可。2) 在两种语言之间要进行转换通过引用对应的jni.h(针对C语言)根据上面的要求,可以了解到任何语言平台如果满足上面的两个要求,这种语言就能够被Java程序调用。在Windows平台上,主流开发语言(C、C+、C#、Object Pascal等)都能编译产生动态链接库;但是能找到一种类似jni.h、在两种异质语言之间映射数据结构的中介却不是非常容易。因此,一般还是以C或者C+为主要的调用语言平台。7、Java应用本地方法示意图Java应用C应用C+应用C应用调试高效汇编应用应用异常处理C应用运行时刻类型检查8、Java基本类型到本地类型的映射在编
9、码过程中,需要注意变量的长度问题,例如Java的整型变量长度为32位,而C语言为16位,所以要仔细核对变量类型映射表,防止在传值过程中出现问题。Java中的数据类型都会按一定规则进行映射为本地数据类型,这些数据类型都是在 jni.h中定义的。下面分别按照基本数据类型,和对象类型列出。9、Java中的类到本地类型的映射1.1.2 应用JNI的示例1、开发的基本步骤JNI规范最初便是针对Java调用C语言的,因此对C程序的调用具有一套约定俗成的步骤。(1)编写带有native声明的方法的java类(2)使用javac命令编译所编写的java类(3)使用javah ?jni java类名生成扩展名为
10、h的头文件(4)使用C/C+实现本地方法(5)将C/C+编写的文件生成动态连接库任何C编译工具都能用来完成此项工作,如Windows平台的VC+和BCB、Linux平台的gcc、Solaris平台的cc。2、创建带有本地方法的Java应用的Employee类class Employeepublic native void showSalary(); /声明要调用的本地方法,/native本地方法关键字static /读取本地动态链接库System.loadLibrary(Employee);public static void main(String args)(new Employee().
11、showSalary(); /调用本地方法1) 上面的Java程序在结构上与普通的Java程序的不同之处在于,它首先声明了一个native方法showSalary()。native与在interface中的声明方法很类似,但是两者却有本质的区别:interface中声明的只是方法的结构而已,可以认为是对方法做出的定义,interface自身并不实现方法,更没有能力提供方法;而native方法却可以认为是class自身提供的方法,只不过这种方法不是由自身来实现的,而是依靠本地动态链接库输出的函数。2) 在接下来的部分是一段静态(static)代码,载入动态链接库,之前声明的native方法就将在
12、载入的动态链接库中寻找。如果native方法分散在多个动态链接库中,则需要载入多个动态链接库。本例程载入的动态链接库命名为“Employee”,这意味着在Windows平台上,Java程序将在java.library.path参数所指向的路径,以及PATH环境变量所指向的路径中寻找并载入Employee.dll文件。3) 在main()方法中,调用native方法和调用普通方法是完全相同的。3、建立c端代码头文件(1)首先编译Java端代码(2)其次通过javah工具为Employee.class生成c端代码头文件(Employee.h)(3)Employee.h文件中的程序代码#includ
13、e /* Header for class Employee */#ifndef _Included_Employee#define _Included_Employee#ifdef _cplusplusextern C #endif/* * Class: Employee * Method: showSalary * Signature: ()V */JNIEXPORT void JNICALL Java_Employee_showSalary (JNIEnv *, jobject);#ifdef _cplusplus#endif#endif其中JNIEXPORT void JNICALL
14、Java_Employee_showSalary(JNIEnv *, jobject)是Employee.java文件中本地方法的本的实现函数的声明部分。javah工具在生成的头文件中,在方法名前面加上了“Java_类名”。另外请注意,JNI规范中为所有的函数均加上了两个参数:一个是指向JNIEnv类型的指针,另一个是jobject类型的变量。JNIEnv和jobject类型都是在jni.h中定义的,jni.h由各个平台的JDK自带(存在于JDKinclude目录下)。4、 编程C端功能实现代码Employee.c#include jni.h#include Employee.h#includ
15、e stdio.hJNIEXPORT void JNICALLJava_Employee_showSalary(JNIEnv *env,jobject obj) printf(your salary is 5000$/月n); return;在代码中首先需要引入两个头文件:一个是JDK自带的jni.h,另一个则是使用javah工具产生的Employee.h。其它的*.h根据程序的需要引用。5、创建.dll文件在Windows平台上可以选用VC+编译Employee.c,从而产生最终需要的Employee.dll动态链接库文件,在编译过程中需要引入jni.h(存在于JDKinclude目录下)。
16、等JDK为Windows平台提供的头文件。(1)创建一个VC+的项目(2)指定项目的名称(3)指定项目的类型(4)在项目中添加有关的程序文件和头文件 (5)设置编译选项(6)设置编译的结果文件的目录和需要包含的各种文件注意:需要包含jni.h(存在于JDKinclude目录下)文件。(7)编译本项目当然,也可以利用命令行方式的VC+命令编译cl -If:jdkinclude -If:jdkincludewin32 -LD Employee.c -Fe employee.dll命令行中的cl.exe是VC+提供的编译工具,存在于VC+bin目录下。涉及的命令选项说明如下。1) -I:指引入(In
17、clude)必要的头文件所在的路径。请读者们根据自己机器上JDK安装的路径自行调整路径;如果HelloWorld.h不在当前目录下,也请通过“-I”选项予以引入。2) -LD:指载入(Load)源文件。3) -Fe:编译后输出的文件。(8)产生出最终的*.dll文件6、执行Java程序(1)保证*.dll文件和*.class文件在同一个目录中(2)采用正常的方式执行Java程序 java Employee如果执行过程中发生如下异常:Exception in thread main java.lang.UnsatisfiedLinkError: no employee in java.library.pathat java.lang.ClassLoader.loadLibrary(ClassLoader.java:1410)at java.lang.Runtime.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 计数原理与概率统计-2025届高考数学二轮复习易错重难提升【新高考版】(含解析)
- 中班美术详案教案及教学反思《树叶印画》
- 2023年中考物理一轮复习教案- 透镜和凸透镜成像规律
- 康复护理病例讨论制度
- 工厂消防安全制度建设
- 2024年专用版:代理货物运输合作协议
- 大班儿歌教案11篇
- 2024年健身服务合同(标的:0000会员服务费)
- 2024年【初中政治】40道经典单项选择题(含答案)90%考点都在这
- 2024年【初中历史】同类知识归纳比较共8个方面常考易丢分
- 2024年人教版七年级上册英语期中综合检测试卷及答案 (一)
- 组织管理体系-
- 山西省太原市2022-2023学年八年级上学期期中历史试题(解析版)
- 锅炉和压力容器 第1部分:性能要求 征求意见稿
- 园艺用品采购合同范本
- 路基土石方数量计算表
- 湘教版八年级上册初二数学全册表格式教案
- 《工程泥浆技术标准》
- 2024年江苏苏州市(12345)便民服务中心招聘座席代表人员【重点基础提升】模拟试题(共500题)附带答案详解
- 2024年合租租房合同电子版(三篇)
- 羊水过少课件
评论
0/150
提交评论