JNI初体验

 实验室想将现有的较成熟的手势识别、汉字识别、语音识别添加到已经使用java开发完成的工具箱的一个版本中。由于这些较成熟的汉字识别和语音识别都是用c++实现的,所以要实现这已要求必须考虑使用JNI了。

一、JNI简介

JNI的介绍在网上有一些,入门就是看的那些资料,另外要想深入的去学习,应该需要参考技术手册《The Java™ Native Interface -- Programmer’s Guide and Specification》。

使用JNI技术,一般遵循下面的过程:

1.  定义本地类和方法

2.  使用javac编译类文件

3.  使用javah命令创建本地方法对应的头文件

4.  创建本地方法的具体实现

5.  编译本地方法,生成动态库

6.  运行java程序

 

参考资料:

http://www.javaresearch.org/article/39033.htm JNI入门的一篇文章

The Java™ Native Interface -- Programmer’s Guide and Specification

 

二、我遇到的错误

错误一:javah路径问题

我的项目使用eclipse来构建,其中类VoiceSpeak.java,HanRecognize.javaVocieSpeak.java创建在目录…/src/cn/iscas/recognize下,在使用javah HanRecognize 的时候报错:

错误: 无法访问 HanRecognize
错误的类文件: ./ HanRecognize.class
类文件包含错误的类: cn.iscas.recognize.HanRecognize
请删除该文件或确保该文件位于正确的类路径子目录中。

解决方案:首先将javah后的参数名前加上包名即:javah cn.iscas.recognize.HanRecognize;然后将运行javah的目录移至…/src下。

在使用javah命令生成对应的头文件的时候,一定要使用正确的路径才能生成正确的对应的.h的头文件。

 

错误2dll路径问题

dll也要放在合适的路径下,在本次项目中将生成的.dll文件放在了和src的父目录下?

  

错误3java.lang.UnsatisfiedLinkError

在使用JNI的时候,另外一个通常出现的错误即java.lang.UnsatisfiedLinkError,根据技术文档,出现该问题有如下原因:

l  没有正确的使用System.loadlibrary加载动态库,动态库的名称错误、路径错误或者动态库没有放在合适的路径下。

l  Attempting to load the same native library by multiple class loaders。尝试使用多个类加载器加载同一个动态库??

l  If native functions matching an encoded native method name are present in multiple native libraries, the function in the native library that is loaded first is linked with the native method. If no function matches the native method name, an UnsatisfiedLinkError is thrown.如果定义的本地方法没有被实现,也会抛出UnsatisfiedLinkError

错误4:编码问题

 由于在JNI的调用过程中参数和返回值存在汉字问题,在java和c++中对汉字编码不同,所以遇到了汉字识别的问题。

错误5:线程问题

 

三、调用汉字识别

前置文件:汉王识别库*.dll

使用过程:

1.  定义本地类和方法。根据需要定义识别方法。

    public native int HWInit();

    public native int HWClose(int h); 

public native String HWRecognize(int numOfStroke, char[] pointSet, String lpResult);

2. 生成.h文件,并在.h对应的.cpp中实现方法。由于汉王识别库提供了使用接口(参见),所以我们要做的就是在.cpp中调用汉王库.dll提供的接口,来实现识别的功能。在实现的过程中,一定特别注意汉字编码的转换,因为在java中所有内容都是使用unicode来编码而在c++中汉字是使用gb2312来编码的。

参考资料:

http://blog.csdn.net/qinysong/archive/2006/09/05/1179480.aspx java字符编码

http://www.360doc.com/content/090417/15/107226_3164994.html 中文字符转换

项目recognize包中的示例程序

 

四、调用语音识别和TTS

前置条件:安装微软语音识别库,如有必要,还要进行识别训练。

使用过程:

1.  定义本地类和方法。根据需要定义识别方法。

    public native String recog();

2. 生成.h文件,并在.h对应的.cpp中实现方法。voiceRecog.dll即实现了调用微软语音识别方法调用,voiceSpeak.dll即实现了微软语音库TTS的调用。

参考资料:

http://blog.csdn.net/yincheng01 一位关注于微软语音库的程序员

http://blog.csdn.net/dedodong/archive/2006/07/15/923543.aspx 一个基于linuxTTS系统

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值