前言

由于学期作业的要求,笔者需要开发一个语音识别系统。出于对Java的热爱,笔者非常想用Java来写上层程序(前台+数据库的三层),又要用到Microsoft Speech SDK,所以在这些条件下,产生了用Java调用DLL的需求。经过几天的查资料和摸索,写成了这篇教程。虽说网上的相关教程不少,但是也没有一篇博文能完全解决我的问题。今借此地补充之。

环境

windows7 + JDK1.8 + NetBeans8.0 + visual studio 2010

正文

1.我们在NetBeans中新建项目,取名TestNativeCode,建包com.test.nativecode,建主类TestNativeCode。代码如下
package com.test.nativecode;

public class TestNativeCode {
static{
System.loadLibrary("NativeCode");
}
public native void saySomeThing();
public static void main(String args[]){
TestNativeCode test = new TestNativeCode();
test.saySomeThing();
}
}

1.1如图一,右击源文件,选择编译文件。


图一

好了,编译好的 .class已经安静地在 build\classes\com\test\nativecode里等我们了。


2.打开cmd,进入包所在目录。以笔者为例,包所在文件夹为E:\WorkPlace\NetBeansWorkPlace\TestNativeCode\build\classes。cmd中命令如下。
e:
cd WorkPlace\NetBeansWorkPlace\TestNativeCode\build\classes

2.1利用javah生成.h头文件,命令如下。

javah com.test.nativecode.TestNativeCode

然后,我们得到生成好的.h头文件,如图二

图二

3.在Visual Studio 2010中新建win32项目, 取名 CppNativeCode,选择DLL,如图三。
图三

4. 将2.1生成好的.h头文件加入vs2010的工程头文件文件夹里。以笔者为例,将com_test_nativecode_TestNativeCode.h 放入到 E:\WorkPlace\vs2010WorkPlace\CppNativeCode\CppNativeCode里。

4.1 在vs2010中,右击项目的头文件,头文件, 添加, 现有项。选择 com_test_nativecode_TestNativeCode.h。如图四。
图四

4.2 然后打开com_test_nativecode_TestNativeCode.h 我们看到,显示找不到 jni.h。解决方法如下,把Java\JDK\include目录下的 jni.h拷贝至 E:\WorkPlace\vs2010WorkPlace\CppNativeCode\CppNativeCode 内即可, 修改#include <jni.h> 为#include "jni.h"。如图五。

图五

4.3 将Java\jdk1.8.0_05\include\win32 下的 jni_md.h 拷贝至 E:\WorkPlace\vs2010WorkPlace\CppNativeCode\CppNativeCode 。

5. 如果你是32位机可以跳过这步。64位机需要将vs2010的解决方案平台修改为64位,选择生成 ---配置管理器。如图六。

图六

5.1 选择平台---新建---选择x64。如图七。

图七

6. 编译--生成。以笔者为例,在E:\WorkPlace\vs2010WorkPlace\CppNativeCode\Debug 生成了 CppNativeCode.dll 。
6.1 将 CppNativeCode.dll 放入相应的 Path 路径中,以笔者为例,放入 C:\Program Files\Java\jdk1.8.0_05\bin 中即可。
7.运行NetBeans中的项目即可。以笔者为例,效果如图八。

参考资料







版权声明:本文为博主原创文章,未经博主允许不得转载。

Java利用JNI调用C/C++写成的DLL的更多相关文章

  1. JAVA使用JNI调用C++动态链接库

    JAVA使用JNI调用C++动态链接库 使用JNI连接DLL动态链接库,并调用其中的函数 首先 C++中写好相关函数,文件名为test.cpp,使用g++编译为DLL文件,指令如下: g++ -sha ...

  2. [置顶] android利用jni调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so

    0:前言: 在第二篇中,我们主要介绍了丙方android公司利用乙方C++公司给的动态库,直接调用库中的方法,但是这样方式受限于: 乙方C++公司开发的动态库是否符合jni的规范,如果不规范,则不能直 ...

  3. [置顶] android利用jni调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so

    0:前言 1:本文主要作为丙方android公司的身份来写 2:作者有不对的地方,请指出,谢谢 [第一篇:android利用jni调用第三方库——编写库libhello.so] [第二篇:androi ...

  4. Java通过JNI调用dll详细过程(转)

    源:Java通过JNI调用dll详细过程 最近项目有这样一个需求,在已有的CS软件中添加一个链接,将当前登录用户的用户名加密后放在url地址中,在BS的login方法里通过解密判断,如果为合法用户则无 ...

  5. ubuntu下Java通过JNI调用C

    下面看一个实例,如下: public class TestJNI { static { System.loadLibrary("diaoyong"); // 程序在加载时,自动加载 ...

  6. JAVA 利用JNI加密class文件/自定义ClassLoader 类

    利用 JNI 对bytecode 加密.不影响java程序员的正常开发.09年的时候写的,现在拿出来晒晒————————————————————————————混淆才是王道,如果混淆再加密就更酷了.. ...

  7. Java通过jni调用动态链接库

    (1)JNI简介 JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++).从Java1.1开始,JNI标准成为java ...

  8. Java通过JNI调用C

    Java调用C有多种方式,本文介绍笔者最近的学习过程,避免今后再犯类似的错误. 首先,Java肯定是调用C的动态链接库,即通过编译器编译后的dll/so文件. 下面介绍gcc编译dll的方法. 一般情 ...

  9. JAVA的JNI调用

    由于JNI调用C和调用C++差不多,而且C++中可以混合写C代码,所以这里主要是写关于JNI调用C++的部分. 一般步骤: 先是写普通的Java类,其中包括本地方法调用.  然后编译这个Java类,调 ...

随机推荐

  1. DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库.

    DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库. 它是轻量级的,不依赖任何其他类库(如JQuery)并且高度可定制. 试试看! 将文件拖至此处或点击上传.(这仅仅是 dropzo ...

  2. Entity Framework学习初级篇1--EF基本概况《转》

    最近在学习研究微软的EF,通过这时间的学习研究,感觉这个EF目前来说还不是很完善,半成品.不过,据说在.Net4.0中,微软将推荐使用此框架,并会有所改善.而且,现在基本上所有数据库均提供了对EF的支 ...

  3. 关于 CGI,Fastcgi和php-fpm 理解

    首先,CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编写者. web server(比如说nginx)只是内容的分发者.比如,如果请求/index.h ...

  4. jQuery-设计模式

    [目录] 一.选择网页元素 二.改变结果集 三.链式操作 四.元素的操作:取值和赋值 五.元素的操作:移动 六.元素的操作:复制.删除和创建 七.工具方法 八.事件操作 九.特殊效果 [正文] 一.选 ...

  5. idea上将项目上传到github

    1.下载并安装好git,然后配置git的path路径.再配置git的全局用户名和邮箱. 2.注册github账号,如果已经有github账号,则此步骤可以省略. 3.在idea中配置git,配置如下: ...

  6. python deque

    Deque objects support the following methods: append(x)¶ Add x to the right side of the deque. append ...

  7. html5-增强的表单

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  8. hdu4749 kmp改进

    这题说的是给了一个模板串 然后又给了一个串 需要找出类似的按个模板串 , 改相等的位置要相等 该大于的位置到大于 我们将模板串做好失配指针就ok了,然后匹配和原来的匹配不同,这个匹配需要的是相对匹配, ...

  9. Sitecore CMS中配置模板部分

    如何在Sitecore CMS中配置模板部分. 注意: 本教程将扩展于“Sitecore CMS中创建模板”的章节. 配置折叠状态 配置模板部分的折叠状态允许用户选择默认折叠或展开哪些模板部分.此设置 ...

  10. Linux 进程间通讯

    一.Linux 下进程间通讯方式 1)管道(Pipe)及有名管道(named pipe): 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...