• Java利用JNI调用C/C++写成的DLL


    前言

    由于学期作业的要求,笔者需要开发一个语音识别系统。出于对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中的项目即可。以笔者为例,效果如图八。

    参考资料






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

    智慧在街市上呼喊,在宽阔处发声。
  • 相关阅读:
    linux_java_同时启动三个项目脚本
    Python 项目-飞机大战_02.飞机大战-2
    Python 项目-飞机大战_01.飞机大战-1
    Mysql为什么要使用视图?
    Python语法基础_10.加强练习
    Python语法基础_09.面向对象3、异常、模块
    crontab--设置周期性被执行的指令
    面试者应向公司问什么问题?
    简单的触发黑名单阻断演示 control+c
    SetConsoleCtrlHandler演示
  • 原文地址:https://www.cnblogs.com/fengyubo/p/4627871.html
Copyright © 2020-2023  润新知