声明:ICTCLAS以及我修改ICTCLAS JNI For Java的版权均归原作者所有,未经原作者允许,请勿作其它商业用途
首先下载ICTCLAS Beta版本公开源代码:点击下载
我使用的是Visual studio
2005开发环境,源码使用VC6开发的,现在把这个工程转移到VS2005下。我使用的方法比较笨,基本上是属于体力+暴力型的,不过自己觉得爽就可以了
在VS2005里新建Win32项目FREEICTCLAS,在application Settings选项里选中Dll和Empty
Project,然后新建以下过滤器(New Filter),并且将原项目的源码及其目录结构copy到现在的win32项目的目录下(过滤器和项目目录示意图)
示意图(点击前面+号展开)
|
|
这样这个win32工程基本就建完了。
观察ICTCLAS源代码后编写以下带有native声明的方法的java类,只实现了头两个方法,第三个暂未实现,与ICTCLAS接口基本保持一致
代码如下:
FreeICTCLAS.java(点击+展开)
public class FreeICTCLAS
{
///*
* 初始化设置取值都是0,1,2
*/
public native boolean
FreeICTCLAS_Init(int OperateType, int OutputFormat);
///*
* 与Free版本中有所不同,返回值为结果
/
public native String
FreeICTCLAS_ParagraphProcess(String sParagraph);
/**//
* 与Free版本中基本保持一致
*/
public native boolean
FreeICTCLAS_FileProcess(String sSourceFilename, String sResultFilename);
public static void main(String[]
args)
{
System.loadLibrary(“FreeICTCLAS”);
FreeICTCLAS test = new
FreeICTCLAS();
test.FreeICTCLAS_Init(0,0);
String str =
test.FreeICTCLAS_ParagraphProcess(“与Free版本中有所不同,返回值为结果,和平奥运,绿色奥运,今天天气很是不错啊”);
System.out.println(str);
}
}
然后在命令行输入Javac FreeICTCLAS.java编译FreeICTCLAS.java
生成FreeICTCLAS.class文件后,再使用javah FreeICTCLAS生成FreeICTCLAS.h,代码如下:
///*
DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
///*
Header for class FreeICTCLAS /
#ifndef _Included_FreeICTCLAS
#define _Included_FreeICTCLAS
#ifdef __cplusplus
extern
“C”
{
#endif
/**//
* Class: FreeICTCLAS
* Method: FreeICTCLAS_Init
* Signature: (II)Z
*/
JNIEXPORT jboolean JNICALL
Java_FreeICTCLAS_FreeICTCLAS_1Init
(JNIEnv , jobject, jint, jint);
/**//
* Class: FreeICTCLAS
* Method:
FreeICTCLAS_ParagraphProcess
* Signature:
(Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL
Java_FreeICTCLAS_FreeICTCLAS_1ParagraphProcess
(JNIEnv , jobject, jstring);
/**//
* Class: FreeICTCLAS
* Method: FreeICTCLAS_FileProcess
* Signature:
(Ljava/lang/String;Ljava/lang/String;)Z
*/
JNIEXPORT jboolean JNICALL
Java_FreeICTCLAS_FreeICTCLAS_1FileProcess
(JNIEnv *, jobject, jstring,
jstring);
#ifdef __cplusplus
}
#endif
#endif
将FreeICTCLAS.h拷贝到win32项目所在目录中,再将其添加到项目中,接下来就是编写FreeICTCLAS.cpp实现头文件里方法
主要代码如下:
#include “FreeICTCLAS.h”
#include “util.h”
#include “globeVar.h”
#include <string.h>
#include <stdlib.h>
///*
* Class: FreeICTCLAS
* Method: FreeICTCLAS_Init
* Signature: (II)Z
*/
JNIEXPORT jboolean JNICALL
Java_FreeICTCLAS_FreeICTCLAS_1Init
(JNIEnv *env, jobject obj, jint
OperateType, jint OutputFormat)
{
m_ICTCLAS.m_nOperateType =
OperateType;
m_ICTCLAS.m_nOutputFormat =
OutputFormat;
return JNI_TRUE;
}
///*
* Class: FreeICTCLAS
* Method:
FreeICTCLAS_ParagraphProcess
* Signature:
(Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL
Java_FreeICTCLAS_FreeICTCLAS_1ParagraphProcess
(JNIEnv env, jobject obj, jstring
sParagraph)
{
char sResult,sSource;
sSource = jstringTochar(env,
sParagraph);
if(m_ICTCLAS.m_nOutputFormat!=2)
sResult=new char
[(strlen(sSource)+13)3];
else
sResult=new char
[(strlen(sSource)+13)50];
if(!m_ICTCLAS.ParagraphProcessing(sSource,sResult))
exit(1);
else
return
chartoJstring(env,sResult);
}
/**//
Class: FreeICTCLAS
Method: FreeICTCLAS_FileProcess
Signature:
(Ljava/lang/String;Ljava/lang/String;)Z
/
JNIEXPORT jboolean JNICALL
Java_FreeICTCLAS_FreeICTCLAS_1FileProcess
(JNIEnv *env, jobject obj, jstring
sSourceFilename, jstring sResultFilename)
{
return JNI_TRUE;
}
编译项目,在release目录中找到FreeICTCLAS.dll,将其拷贝到FreeICTCLAS.class所在的目录中
现在运行java FreeICTCLAS即可看到中文分词的结果啦
怎么把ICTCLAS JNI for Java添加到eclipse项目中去?下次写吧。
当你看到这句话的时候,你可以直接发邮件向我索要win32项目和eclipse项目
BlogJava后台编辑器不好用,^_^