### JNI设计实践之路 #### 一、前言 在探讨JNI(Java Native Interface)的设计实践之前,我们需要了解JNI的基本概念及其应用场景。JNI是一种强大的技术,它允许Java应用程序直接调用用其他语言(如C/C++)编写的本地方法。这种能力对于那些需要高性能计算、直接访问硬件资源或是调用已有非Java库的应用程序来说至关重要。 本文档旨在提供一个在32位Windows平台上实现Java本地方法的实际案例。我们将使用Sun公司的Java Development Kit (JDK) 版本1.4.2,并采用Microsoft Visual C++ 6.0编译器来编译本地代码。此外,我们还将探讨以下几个关键问题: 1. 如何让Java程序调用现有的DLL? 2. 如何在C++程序中创建、检查及更新Java对象? 3. 如何在C++和Java程序中互相抛出异常,并进行异常处理? 4. 探讨为什么使用Eclipse及JBuilder工具生成的可执行文件大小不足100K,以及背后所采用的技术方案。 #### 二、JNI基础知识简介 ##### Java与非Java代码交互的需求 虽然Java语言及其标准库足以满足大多数应用程序的开发需求,但在某些特殊情况下,仍然需要使用非Java代码。例如: - 打印功能 - 图像转换 - 访问硬件资源 - 调用现有非Java库 为了实现Java与非Java代码之间的通信,开发人员需要编译器和JVM的支持,以及额外的工具来将Java代码映射到非Java代码。目前,有多种方案可供选择,主要包括: 1. **JNI (Java Native Interface)** 2. **IGL (Java Runtime Interface)** 3. **J/Direct** 4. **RNI (Raw Native Interface)** 5. **Java/COM 集成方案** 6. **CORBA (Common Object Request Broker Architecture)** 在这些方案中,JNI是最常用且被广泛支持的。它作为JDK的一部分,提供了丰富的API来实现Java与非Java代码之间的交互。下面我们将详细介绍JNI的基本原理及其使用方式。 #### 三、JNI基本原理 JNI作为一种通用的编程接口,允许Java应用程序调用本地化方法。这意味着,在JVM上运行的Java程序能够与用其他语言(如C/C++)编写的程序或库进行相互调用。JNI还提供了一系列API,支持将Java虚拟机直接嵌入到本地应用程序中。 JNI的主要功能包括: 1. 创建、检查及更新Java对象。 2. 调用Java和非Java程序所编写的函数,包括Win32 API等。 3. 捕获和抛出异常。 4. 加载类并获取类信息。 5. 进行运行时类型检查。 通过JNI,几乎所有在Java程序中能够对类及对象的操作都可以在本地化方法中实现。 #### 四、使用JNI编写Java程序调用非Java程序的步骤 使用JNI编写Java程序调用非Java程序的一般步骤如下: 1. 编写对本地化方法及其参数进行声明的Java代码。 2. 使用头文件生成器`javah`生成本地化方法对应的头文件。 3. 使用C/C++实现本地化方法,并编译、链接生成DLL文件。 4. Java程序通过生成的DLL文件调用非Java程序。 下面以具体的例子来说明这一过程: **实例1:调用求圆面积的C++ DLL** 假设有一个名为`Circle.dll`的DLL文件,使用Microsoft Foundation Classes (MFC)编写,参数为圆的半径,返回值为圆的面积。我们希望在Java程序中调用这个DLL。 1. **本地化方法声明**: ```java package com.example.math; public class Circle { static { System.loadLibrary("Circle"); } public native double area(double radius); } ``` 2. **生成头文件**: 使用`javah -jni com.example.math.Circle`命令生成对应的头文件`Circle.h`。 3. **实现本地化方法**: 使用C++编写本地方法,并确保正确地调用了Java程序中定义的方法。 ```cpp #include <jni.h> extern "C" { JNIEXPORT jdouble JNICALL Java_com_example_math_Circle_area(JNIEnv *env, jobject obj, jdouble radius) { // 实现计算圆面积的逻辑 return 3.14159265358979323846 * radius * radius; } } ``` 4. **编译并链接生成DLL文件**: 使用Visual C++编译器编译上述C++代码,并生成DLL文件。 5. **Java程序调用DLL**: 在Java程序中通过`Circle`类调用`area()`方法,即可得到圆的面积。 #### 结论 通过本篇文章的学习,我们不仅了解了JNI的基本概念和原理,还掌握了如何使用JNI编写Java程序调用非Java程序的具体步骤。这对于那些需要高性能或特定功能的应用程序来说是非常有用的。在未来的工作中,我们可以根据具体的需求灵活运用这些知识来解决问题。
- tanchao1112012-10-09作为入门的资料还不错~
- 粉丝: 58
- 资源: 32
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助