在某些Java的忠实支持者眼中,JNI(Java Native Interface)是难登大雅之堂的,因为JNI生来便仿佛和Java“Write Once, Run Everywhere”的宗旨相背离。其实这是一种偏见,因为只要承认Java在执行一些关键业务时在实时性方面的不足,只要承认Java在与底层交互方面存在诸多壁垒,JNI便有其存在的必要。况且,更理性地看待这个问题:Java最初诞生的机缘在于网络的兴起,而后来流行的原因则在于掌握企业计算命脉的几个关键厂商的推波助澜,这一切都决定了Java擅长于企业应用开发,而在实时应用和桌面应用领域的不足。正如同无人能够抹煞Java的安全性和组件化,其他语言自有其存在和发展的理由。JNI正是为Java和其他语言之间的互操作打开了方便之门,可以说,这对Java团队来说是借力打力的好事!
另一种顾虑来自于“耦合度”方面,部分人认为实现异构系统、异质语言之间的互操作途径有很多种,未必需要基于JNI重写系统。笔者认为:(1)系统的耦合度首先不在于技术路线的选型,而在于设计和规划:即使采用SOA(面向服务的体系结构)和ESB(企业服务总线),一个不良的设计,很可能让实施效果大打折扣;(2)应用系统的需求是多方面的,耦合度只是其中之一,而在耦合度之外,还有性能和可靠性等指标:我们不能接受,也难以想象每一次原本可以通过本地调用完成的任务,都要发起一次进程间调用。
本章主要内容包括:
¿ JNI原理
¿ 调用C程序
¿ 调用Delphi程序
本章首先介绍JNI原理,然后分别介绍两种JNI的应用场景:Java语言调用C程序、Java语言调用Delphi程序。
15.1 JNI原理
JNI是Java Native Interface(Java本地接口)的缩写。所谓本地接口,是相对运行在Java虚拟机“沙箱”中的Java程序而言的,指直接运行在操作系统之上,与操作系统直接交互的程序。从JDK 1.1开始,JNI规范成为Java平台的一部分,它允许Java程序和用其他语言编写的程序进行交互。JNI一开始是为了Java程序与本地已编译语言,尤其是C和C++的互操作而设计的,但是这并不意味着不能使用其他语言。
使用Java语言与本地已编译的代码交互,意味着丧失平台Java语言“Write Once, Run Everywhere”的可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。比如,使用一些旧的类库与硬件、操作系统进行交互,或者为了提高程序的性能。JNI规范保证了Java程序能够以尽量少的代码、尽可能相同的方式调用本地类库。
可以形象直观地把JNI看做是Java和本地应用程序的黏合剂。如图15-1所示,JNI规范成为沟通C语言类库及函数和Java对象之间的媒介。
图15-1 JNI原理
一般来说,使用100%纯Java语言编写程序仍然是首选目标,毕竟程序的可移植性和安全性是我们选择Java语言的初衷。概括起来,采用JNI调用本地程序接口的情况包括以下几个方面。
— 为了实现Java语言所不能实现的功能:例如关闭系统、获取CPU繁忙程度等。
— 为了获取更好的程序运行性能:和其他语言一样,Java程序运行的性能很大程度上取决于程序代码的编写质量,但是在一些实时性要求高的应用场合,以“半编译”形态出现的Java语言是难以胜任的,这时借助运行性能更佳的本地程序来完成这些关键任务更为合理。
— 为了保护历史投资:当然前提条件是程序的可移植性不是首要被看重的因素。企业应用开发成本往往是决定编码规模和开发周期的重要因素,当已经有一些使用传统语言编写的模块被证明能够良好地实现企业业务需求,为了缩短开发周期、降低开发成本,可能就需要考虑采用JNI调用这些旧模块。
基于Oracle数据库管理系统开发应用的读者应该不会陌生,Oracle提供的JDBC驱动程序分为两套,采用OCI(Oracle Call Interface)的本地调用类库和纯Java实现的驱动程序类库。采用前者的执行性能更好,而且因为Oracle在主流操作系统平台上提供的供调用的本地类库的调用形式完全相同,因此对应用开发人员而言,使用这套基于JNI原理的驱动程序类库几乎感受不到整个系统的可移植性受到了影响。
指出一点,使用Java虚拟机运行时Java LangRuntime调用外部进程不属于JNI的范畴。关于Java语言如何调用外部进程,请参考本书的第6章“输入输出综合”的有关内容。
在下一节中,我们将介绍使用JNI调用C程序的典型步骤。
http://book.csdn.net/bookfiles/606/10060619591.shtml
分享到:
相关推荐
要深入理解JNI的实现原理,本书《JNI实现原理权威指南》无疑是提供了一个全面的技术指导和规范说明。 ### 知识点一:JNI的概念及其重要性 JNI是Java平台标准版的一部分,它为Java代码和本地应用程序接口(API)...
**JNI原理** JNI的核心在于创建一个桥接,允许Java代码与本地代码交互。当Java虚拟机(JVM)遇到一个声明为`native`的方法时,它不会尝试解释执行该方法,而是通过JNI接口寻找对应的本地实现。这个本地实现通常是一...
同时,由于涉及到跨语言和跨平台,理解JNI的工作原理和正确使用JNI头文件至关重要,这样才能确保Java和本地代码之间的无缝交互。 在提供的压缩包`jni.zip`中,包括了`jni.h`和`jni_md.h`两个头文件,它们是进行JNI...
1. **JNI简介** JNI是Java平台的标准接口,它提供了一套规范,使得Java代码可以调用本地(Native)代码,也就是非Java语言编写如C、C++的代码。同时,本地代码也可以调用Java方法。这种交互机制极大地扩展了Java...
1. **入门教程**:第二章通过一个简单的示例,向初次接触JNI的读者介绍其基本概念和工作原理。这部分内容适合对JNI不熟悉的初学者,帮助他们快速理解和掌握JNI的基本用法。 2. **全面介绍**:第三至第十章系统地...
JNI,全称Java Native ...在实际开发中,理解JNI的工作原理和正确管理内存至关重要,以避免可能出现的内存泄漏和异常。同时,需要注意的是,频繁的JNI调用会增加应用程序的复杂性,并可能影响性能,因此应当适度使用。
这个压缩包通常包含了该版本的所有必要的组件和文件,便于用户...然而,使用它需要对Java和.NET的互操作有一定了解,以及对JNI原理的熟悉。通过不断学习和实践,开发者可以充分利用jni4net带来的便利,提高开发效率。
1. JNI的概念和工作原理。 2. 如何声明和调用本地方法。 3. 使用`javah`生成C/C++头文件。 4. 编写C/C++代码实现本地方法。 5. 参数和返回值的传递,以及异常处理。 6. `JNIEnv`指针及其在调用Java功能中的作用。 7....
标题中的"zstd-jni-1.4.0-1.zip"表明这是一个关于Zstandard (Zstd)的Java Native Interface (JNI)库的压缩包,版本号为1.4.0,可能包含了一些修复和改进。这个库允许Java应用程序利用Zstd的高效压缩和解压缩算法,而...
通过深入学习和实践这些文档,开发者不仅能理解JNI的工作原理,还能熟练地编写混合Java和本地代码的应用程序。同时,理解和遵守JNI编程规范能确保代码的可维护性和健壮性,避免潜在的问题,如内存泄漏、线程安全问题...
`C++ GUI Programming with Qt 4.chm`可能就是一本关于如何使用C++和Qt创建GUI的参考资料,虽然没有直接提供关于JNI的细节,但它可以帮助理解C++和GUI编程的基本原理,这对于在Java中通过JNI调用Qt库是非常有帮助的...
1. **JNI基础概念**: JNI是一种接口,定义了一套标准的函数调用约定,使得Java虚拟机(JVM)能够调用本地(非Java)代码,同时也允许本地代码调用Java对象。JNI接口主要由一组全局函数指针、结构体和常量定义组成...
1. **JNI基础**: JNI是Java平台的一部分,为开发者提供了在Java应用中调用本地方法(非Java代码)的能力。JNI接口定义了Java和本地代码之间的桥梁,使得开发者可以充分利用本地库的功能,例如操作系统服务、硬件...
1. **JNI回调JAVA的函数**: 在Java中,我们通常通过定义`native`关键字声明本地方法,这些方法将在JNI层实现。为了在JNI中调用Java的方法,我们需要以下几个步骤: - **编写Java接口或类**:首先,定义一个包含...
JNI,全称Java Native Interface,是...通过阅读这些书籍,可以系统地理解JNI的工作原理,学习如何在Java和本地代码之间建立桥梁,从而在各种复杂场景下灵活地融合Java和C/C++的优点,实现高性能、跨平台的应用程序。
1. **对象追踪**:LeakTracer会监控JNI层创建的Java对象,记录它们的生命周期,包括创建、使用和释放过程。 2. **引用分析**:它检查JNI函数中是否存在对Java对象的长期引用,这些引用可能导致对象无法被垃圾回收。...
知识点1:JNI 概念 * JNI 是什么:JNI 是 SUN 定义的一套标准接口,允许 Java 代码调用本地代码,本地代码也可以调用 Java 代码。 * JNI 的作用:JNI 使得 Java 应用程序可以调用 C/C++ 库,并实现语言互操作性。 ...
在这个示例中,`JNI_OnLoad()`函数不仅指定了支持的JNI版本号(`JNI_VERSION_1_4`),还进行了多个本机方法的注册工作,这样Java层就可以调用这些方法了。 #### 三、总结 通过上述分析可以看出,在Android平台中...
本篇文章将通过分析“JniDemo_H246分析_DEMO_jni测试”项目,深入探讨JNI的基本概念、工作原理以及在实际应用中的关键步骤。 首先,我们需要理解JNI的核心概念。JNI为Java开发者提供了一种机制,使得Java代码能够...
1. **第二章:JNI入门** – 针对初次接触JNI的读者,通过一个简单的示例介绍JNI的基础用法。 2. **第三至第十章:深入JNI** – 对JNI的各种特性进行系统性的介绍,包括详细的示例和解释。 3. **第十一至第十三章:...