小码哥

谁谓河广,一苇杭之

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  7 随笔 :: 17 文章 :: 74 评论 :: 0 Trackbacks
声明: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(点击+展开)
然后在命令行输入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后台编辑器不好用,^_^
posted on 2008-05-06 14:40 小码哥 阅读(1113) 评论(1)  编辑  收藏 所属分类: JNI技术学习笔记Java语言学习信息检索

评论

# re: 打造ICTCLAS JNI For Java 2013-07-11 10:23 sirlipeng
可否将编译好的FreeICTCLAS.dll发送给我一份呢?谢谢
sirlipeng@gmail.com  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: