JNI是JDK的一部分,用于为Java提供一个本地代码的接口。通过使用JNI编写的程序能够 确保你的代码能够完全的移植到所有的平台。JNI使得运行在JVM虚拟机上的Java代码能够操 作使用其它语言编写的应用程序和库,比如C/C++以及汇编语言等。此外JNI提供的某些API还 允许你把JVM嵌入到本地应用程序中。下图表达了JNI所扮演的角色。
本文将通过一个 实例来阐述使用VC++6.0来实现JNI的完整过程。使用JNI来整合本地代码和Java代码的步骤是 确定的,没有再创作的余地,所以读者可以通过本文的步骤来逐步认识到,其实Java也是 "没有什么不可以"的。
一、JNI的实现任务描述:在Java中调用windows下 的消息框函数,并且从Java中传递一个字符串作为MessageBox函数的显示文本参数,显示在 消息框的中间。下面让我们一起进入这一奇妙的旅程。
Step 1:写一个Java类,在这 个类中包含了需要调用的本地方法的描述。
//WinMsgBox.java
package edu.netcom.jni;
public class WinMsgBox
{
static{
System.loadLibrary("WinMsgDll"); // (1)
}
public native void showMsgBox(String str); // (2)
}
(1)中WinMsgDll是 动态链接文件的文件名,不用加扩展名,因为在不同的平台下动态链接文件扩展名是不同的 ,由JVM自动识别,比如在Solaris下,会被转换为WinMsgDll.so;而Win32环境下会转换为 WinMsgDll.dll。这个文件名必须和Step 4中生成的文件名一致。这个文件的存放位置也很重 要,它只能被放在JVM属性值java.library.path中指定的文件夹中。这个属性值可以使用 System.getProperty("java.library.path");来查看。一般情况下,至少放在这 几个位置是确定可靠的,windows安装目录下的system32下面,JDK安装目录下的bin下面,以 及调用主类文件的当前目录。
(2)中指明了你必须用本地代码实现的方法。
Step 2:提示符下使用命令javac -d . WinMsgBox.java编译Step 1编写的java文件 。
此时会在当前目录下建立一个edu\netcom\jni目录结构,并且一个WinMsgBox.class文件存在其中。
Step 3:提示符下使 用命令javah -jni edu.netcom.jni.WinMsgBox,此时会在当前目录下产生一个 edu_netcom_jni_WinMsgBox.h文件,注意这个文件名是由(包名+类名)组成,中间用(_) 隔开。此文件内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h> // (1)
/* Header for class edu_netcom_jni_WinMsgBox */
#ifndef _Included_edu_netcom_jni_WinMsgBox
#define _Included_edu_netcom_jni_WinMsgBox
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: edu_netcom_jni_WinMsgBox
* Method: showMsgBox
* Signature: (Ljava/lang/String;)V // (2)
*/
JNIEXPORT void JNICALL Java_edu_netcom_jni_WinMsgBox_showMsgBox
(JNIEnv *, jobject, jstring); // (3)
#ifdef __cplusplus
}
#endif
#endif