前言

由于学期作业的要求,笔者需要开发一个语音识别系统。出于对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. centos下如何清除重复的$PATH变量值

    运行: vim /etc/profile 添加如下代码: awk -F: '{    sep = ""    for (i = 1; i <= NF; ++i)        ...

  2. Kotlin Linux下的环境搭建

    Kotlin是JVM世界里的未来主宰,不管你信不信,我反正相信了! 好吧,如果你不糊涂,就跟着我一起学学吧,哈哈 一下载https://github.com/JetBrains/kotlin/rele ...

  3. (转载)cmd-命令大全及详解

    原文地址:http://greatverve.cnblogs.com/archive/2011/12/09/windows-cmd.html 命令简介 cmd是command的缩写.即命令行 . 虽然 ...

  4. cocos2d JS 错误异常抛出捕获和崩溃拦截

    Error对象 一旦代码解析或运行时发生错误,JavaScript引擎就会自动产生并抛出一个Error对象的实例,然后整个程序就中断在发生错误的地方. Error对象的实例有三个最基本的属性: nam ...

  5. Unity 2D入门基础教程之僵尸先生

    注:这是根据网上教程完成的. 翻译:http://blog.1vr.cn/?p=1422 原文:http://www.raywenderlich.com/61532/unity-2d-tutorial ...

  6. 排名前10的vue前端UI框架框架值得你掌握

    参考:https://juejin.im/post/5b34faeef265da59645b188e muse-ui 框架: https://juejin.im/entry/582974eb8ac24 ...

  7. LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏。

    问题描述:VS2010   LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏. 解决办法: 修改嵌入清单选项为否,然后重新便于创建. 参考自:htt ...

  8. linux常用系统工作命令

    1.echo命令 echo命令用于在终端输出字符串或变量提取后的值,格式为“echo [字符串 | $变量]”. 2.date命令 date命令用于显示及设置系统的时间或日期,格式为“date [选项 ...

  9. [mysql]Date和String相互转换(DATE_FORMAT&STR_TO_DATE)

    1.Date  ——>  String 使用的函数:DATE_FORMAT(date,format)     date:需要转换的日期       format:格式化的样式 format样式整 ...

  10. 入坑tensorflow

    win10 CPU版,anaconda prompt命令行一句话,pip install --upgrade tensorflow搞定.比caffe好装一万倍. gpu版没装成,首先这个笔记本没装cu ...