畢業設計是做一個中文的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目錄,如下圖所示
編寫帶有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!