您的位置:首页 > 编程语言 > Java开发

Java之本地整合方法----JNI的简略实现

2007-12-28 13:28 791 查看
Java之本地整合方法----JNI的简略实现。

1.JNI基本概念
Java具有很好的平台无关性,但当与其它基于平台完成的项目进行整合时,解决办法当然不能把已有项目全部重新用Java写一遍,
那最好的方法是什么呢?让Java直接调用本地API!没错,JNI正是其解。
JNI是Java Native Interface的缩写,设计它的主要目的有:
1)应用程序需要一些依赖于平台的要素,但标准Java类可能不支持。
2)Java应用直接访问其它语言编写的库和应用程序。
3)可能需要用一些低级编程语言比如汇编,编写一些限时性代码,然后由Java来调用这些功能。

2. JNI实现方法
下面就JNI的调用过程描述一个简单实例,以展现该过程基本方法。
本实例实现功能非常简单,Java类调用本地一个加法运算,将结果用MessageBox报告出来。
平台: JDK 1.5.0_14, WindowsXP,
工具: Eclipse 3.3, Visul Studio 6.0
1) Java类部分:
Java类需要

public class JNICall
{
static
{
System.loadLibrary("JNIExer"); // Loading dll in memory
}

native void reportResult(int arg0, int arg1);

public JNICall()
{
System.out.println("construct in the Java program");
}

/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
JNICall JNT = new JNICall();
JNT.reportResult( 25, 52 );
}

}

2)生成JNICall.h头文件
命令行:javah JNICall
生成结果如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JNICall */

#ifndef _Included_JNICall
#define _Included_JNICall
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: JNICall
* Method: reportResult
* Signature: (II)V
*/
JNIEXPORT void JNICALL Java_JNICall_reportResult
(JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

3)VC6, 兴建DLL工程,名为JNIExer, 将JNICall.h包含进来,并将JDK下include目录设置为VC的Include目录。
将JNIEXPORT void JNICALL Java_JNICall_reportResult实现完成,实现内容为:
JNIEXPORT void JNICALL Java_JNICall_reportResult
(JNIEnv *evn, jobject job, jint arg0, jint arg1 )
{
char strResult[10];
sprintf( strResult, "%d", arg0+arg1 );

MessageBox( 0, strResult, "the result is: ", 0 );
}

编译,构造,得到JNIExer.dll。
至此,本地库已经完成。

4)
将JNIExer.dll拷贝到JNICall.class同一目录下,在Eclipse里面运行JNICall.java。
运行时,如果报UnSatisfiedLinkError错误,需要设置JVM设置参数.
可在运行之前,先对其运行设置。
打开运行对话框,在"参数“选项卡里的”VM auguments"里填上如下语句:
-Djava.library.path="path" (path是指JNICall.class所在目录路径)
运行JNICall,得到结果。

3. 总结
在介绍过程中,首先将加法功能实现在VC构造的DLL里,并在实现过程中调用本地API:MessageBox(),实现了本地调用的过程。
有关JNI的文档有: http://java.sun.com/j2se/1.5.0/docs/guide/jni/spec/jniTOC.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: