前言

由于学期作业的要求,笔者需要开发一个语音识别系统。出于对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. PHP DDOS的UDP攻击,TCP攻击,和CC攻击的核心代码

    网络安全向,请勿用作非法用途 CC攻击模块: <?phpecho “状态 : 正常运行中…..<br>”;echo “================================ ...

  2. 获取 Google USB 驱动程序

    获取 Google USB 驱动程序       另请参阅 安装 USB 驱动程序 使用硬件设备 使用任何 Google Nexus 设备进行 ADB 调试时,只有 Windows 需要 Google ...

  3. python路径相关操作

    #获取当前文件所在目录filedir = __file__ print os.path.dirname(filedir) #获取文件名print os.path.basename(filedir)

  4. nodejs+react使用webpack打包时控制台报错

    一.错误:Uncaught ReferenceError: process is not defined 解决方法: new webpack.DefinePlugin({ 'process.env': ...

  5. docker tool

    安装docker tool http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/ 安装1.8.3 有把vbox等服务器地址加 ...

  6. Vue系列之 => vue组件创建

    创建方式 一 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  7. GBDT:梯度提升决策树

    http://www.jianshu.com/p/005a4e6ac775 综述   GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Ad ...

  8. Java多线程-----线程池详解

    1. 线程池的实现原理 提交一个任务到线程池中,线程池的处理流程如下: 判断线程池里的核心线程是否都在执行任务,如果不是(核心线程空闲或者还有核心线程没有被创建)则创建一个新的工作线程来执行任务.如果 ...

  9. Spark学习之路 (十九)SparkSQL的自定义函数UDF

    在Spark中,也支持Hive中的自定义函数.自定义函数大致可以分为三种: UDF(User-Defined-Function),即最基本的自定义函数,类似to_char,to_date等 UDAF( ...

  10. 【爬虫】biqukan抓取2.0版

    #!python3.7 import requests,sys,time,logging,random from lxml import etree logging.basicConfig(level ...