用 JNI 进行 Java 编程(1)

本教程是关于什么的?

Java 本机接口(Java Native Interface (JNI))是一个本机编程接口,它是 Java 软件开发工具箱(Java Software Development Kit (SDK))的一部分。JNI 容许 Java 代码使用以其它语言(譬如 C 和 C++)编写的代码和代码库。Invocation API(JNI 的一部分)能够用来将 Java 虚拟机(JVM)嵌入到本机应用程序中,从而容许程序员从本机代码内部调用 Java 代码。java

本教程涉及 JNI 最多见的两个应用:从 Java 程序调用 C/C++,以及从 C/C++ 程序调用 Java 代码。咱们将讨论 Java 本机接口的这两个基本部分以及可能出现的一些更高级的编程难题。程序员

我应该学习本教程吗?

本教程将带您去了解使用 Java 本机接口的全部步骤。您将学习如何从 Java 应用程序内部调用本机 C/C++ 代码以及如何从本机 C/C++ 应用程序内部调用 Java 代码。编程

全部示例都是使用 Java、C 和 C++ 代码编写的,并能够移植到 Windows 和基于 UNIX 的平台上。要彻底理解这些示例,您必须有一些 Java 语言编程经验。此外,您还须要一些 C 或 C++ 编程经验。严格来讲,JNI 解决方案能够分红 Java 编程任务和 C/C++ 编程任务,由不一样的程序员完成每项任务。然而,要彻底理解 JNI 是如何在两种编程环境中工做的,您必须可以理解 Java 和 C/C++ 代码。安全

咱们还将讲述一些高级主题,包括本机方法的异常处理和多线程。要充分理解本教程,您应该熟悉 Java 平台的安全性模型,并有一些多线程应用程序开发的经验。多线程

这里将关于高级主题 的节从较基本的按部就班 JNI 简介中划分出来。如今,初级 Java 程序员能够先学习本教程的前两部分,掌握以后再开始学习高级主题。jvm

请参阅参考资料,那里有关于本文所提到的教程、文章和其它一些参考书目的清单。工具

工具与组件

要运行本教程中的示例,您须要下列工具与组件:学习

* Java 编译器:随 SDK 一块儿提供的 javac.exe。开发工具

* Java 虚拟机(JVM):随 SDK 一块儿提供的 java.exe。线程

* 本机方法 C 文件生成器:随 SDK 一块儿提供的 javah.exe。

* 定义 JNI 的库文件和本机头文件。jni.h C 头文件、jvm.lib 和 jvm.dll 或 jvm.so 文件,这些文件都是随 SDK 一块儿提供的。

* 可以建立共享库的 C 和 C++ 编译器。最多见的两个 C 编译器是用于 Windows 的 Visual C++ 和用于基于 UNIX 系统的gcc。

虽然您可使用本身喜欢的任何开发环境,但咱们将在本教程中使用示例是用随 SDK 一块儿提供的标准工具和组件编写的。请参阅参考资料来下载 SDK、完整的源文件以及对于完成本教程不可缺乏的其它工具。本教程具体地解释了 Sun 的 JNI 实现,该实现被认为是 JNI 解决方案的标准。本教程中没有讨论其它 JNI 实现的详细信息。

 

其它注意事项

在 Java 2 SDK 中,JVM 和运行时支持位于名为 jvm.dll(Windows)或 libjvm.so(UNIX)的共享库文件中。在 Java 1.1 JDK 中,JVM 和运行时支持位于名为 javai.dll(Windows)或 libjava.so(UNIX)的共享库文件中。版本 1.1 的共享库包含运行时以及类库的一些本机方法,但在版本 1.2 中已经不包含运行时,而且本机方法被放在 java.dll 和 libjava.so 中。对于如下 Java 代码,这一变化很重要:

* 代码是用非 JNI 本机方法编写的(由于使用了 JDK 1.0 中旧的本机方法接口)

* 经过 JNI Invocation 接口使用了嵌入式 JVM

在两种状况下,在您的本机库能与版本 1.2 一块儿使用以前,都必须从新连接它们。注:这个变化应该不影响 JNI 程序员实现本机方法 ― 只有经过 Invocation API调用 JVM 的 JNI 代码才会受到影响。

若是使用随 SDK/JDK 一块儿提供的 jni.h 文件,则头文件将使用 SDK/JDK 安装目录中的缺省 JVM(jvm.dll 或 libjvm.so)。支持 JNI 的 Java 平台的任何实现都会这么作,或容许您指定 JVM 共享库;然而,完成这方面操做的细节可能会因具体 Java 平台/JVM 实现而有所不一样。实际上,许多 JVM 实现根本不支持 JNI。

相关文章
相关标签/搜索