毕业设计是做一个中文的XML信息检索系统。当时选题的时候真的是不知道天高地厚,选了这么一个难题,但是毕竟已经选了,那就不要畏缩了!查阅了信息检索的相关资料后,遇到了一个很棘手的问题——中文如何分词?这是个大问题,不知道如何入手。于是查查资料看看有没有现成中文分词系统拿来用,这一找就找到了中科院的ICTCLAS。网上已经有很多的已经封装好了的ICTCLAS.dll,由于毕设打算用Java技术打造一个系统原型,那就需要通过JNI技术来调用ICTCLAS.dll。其实这也已经有人做好了,但是,我还是想知道JNI的个什么样的东西,还想知道如何正确的使用这个技术。

已经习惯了从Hello World开始。
我使用的是JDK_1.6.0和Visual studio 2005,使用Visual studio 2005生成可供Java调用的dll需要做以下设置:
在Visual studio 2005的菜单Tools\options\Projects and Solutions\VC++ Directories,添加JDK安装目录下inlcude和include/win32目录,如下图所示

设置图(点击前面+号展开)
vs05设置

编写带有native声明的方法的java类,代码如下

JniTest.java(点击前面+号展开)

public class JniTest{
/*静态块装载JniTest.dll,不用写出后缀名.dll,因为不同平台,系统会自动识别*/
static {
System.loadLibrary("JniTest");
}
/*native方法申明,不要写具体的实现*/
public native void sayHello();
}

然后在命令行输入Javac JniTest.java编译JniTest.java
生成JniTest.class文件后,再使用javah JniTest生成JniTest.h,代码如下

JniTest.h(点击前面+号展开)

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JniTest */
#ifndef _Included_JniTest
#define _Included_JniTest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     JniTest
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_JniTest_sayHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif

在Visual studio 2005里新建项目Win32 project,在弹出的对话框中点击application setting,然后再选上dll和Empty project。 接着在项目中添加JniTest.h和JniTest.cpp,JniTest.cpp代码如下:

JniTest.cpp(点击前面+号展开)

#include "JniTest.h"
#include<stdio.h>
JNIEXPORT void JNICALL Java_JniTest_sayHello
(JNIEnv *, jobject)
{
printf("Hello World!\n");
}

编译生成JniTest.dll,在项目下找到它,并拷贝到JniTest.java所在的目录,最后编写测试程序Test.java,如下:

Test.java(点击前面+号展开)

public class Test
{
public static void main(String[] args){
new JniTest().jniTest.sayHello();
}
}

最后终于看到了期待的Hello World!