Java如何调用C++ DLL库

 更新时间:2016年06月27日 14:13:23   作者:Joseph_buaa  
本文重点给大家介绍java中调用c++ dll库的方法,本文分步骤介绍的非常详细,感兴趣的朋友可以参考下

 最近做了一个网页端人脸识别的项目,用c++写了人脸识别的算法,但是在网页端要使用java后台,这其中就涉及到了java调用dll的问题。下面是小编通过查阅相关资料,实现的一个简单例子。

1、第一步,先在Java中新建一个类

如上图,其中注意这句System.loadLibrary("javaCallcpp");,这就是加载dll文件的代码了。然后我们需要dll中实现下面定义的加减乘除方法。

2、编译文件,文件名为Java2cpp.java,首先编译成class文件,如果用的是eclipse,这个文件已经自动生成了,在工程目录下的bin文件夹下。用命令行编译,打开cmd窗口,cd到.java文件所在目录,执行命令javac Java2cpp.java,即生成Java2cpp.class

然后执行命令javah Java2cpp生成Java2cpp.h头文件,但是这一步往往会失败,另一种方法可以成功,进入eclipse项目的目录,进入bin文件夹,执行命令javah -classpath . -jni 包名.类名(com.test.jni.Java2cpp),然后生成了com_test_jni_Java2cpp.h

3、在VS中新建项目win32项目,命名为:TestJNI第二步选择如下:

4、把第二步生成的头文件拷进项目文件夹,然后导入。

5、实现头文件中的方法:

(1)新建头文件dllApi.h,代码如下:

#include "com_test_jni_Java2cpp.h"
int DLL_API_ADD(int a, int b);
int DLL_API_SUB(int a, int b);
int DLL_API_MUL(int a, int b);
int DLL_API_DIV(int a, int b); 

(2)新建dllApi.cpp实现上述方法,代码如下:

#include "stdafx.h"
#include <iostream>
#include "dllApi.h"
int DLL_API_ADD(int a, int b)
{
  return (a + b);
}
int DLL_API_SUB(int a, int b)
{
  return (a - b);
}
int DLL_API_MUL(int a, int b)
{
  return (a*b);
}
int DLL_API_DIV(int a, int b)
{
  return (a / b);
} 

(3)在TestJNI.cpp中添加代码实现com_test_jni_Java2cpp.h方法,添加完之后代码如下:

// TestJNI.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "TestJNI.h"
#include "com_test_jni_Java2cpp.h"
#include "dllApi.h"
// 这是导出变量的一个示例
TESTJNI_API int nTestJNI=0;
// 这是导出函数的一个示例。
TESTJNI_API int fnTestJNI(void)
{
  return 42;
}
// 这是已导出类的构造函数。
// 有关类定义的信息,请参阅 TestJNI.h
CTestJNI::CTestJNI()
{
  return;
}
JNIEXPORT jint JNICALL Java_com_test_jni_Java2cpp_DLL_1ADD(JNIEnv *env, jobject obj, jint a, jint b){
  int var = 0;
  var = DLL_API_ADD(a, b);
  return var;
}
JNIEXPORT jint JNICALL Java_com_test_jni_Java2cpp_DLL_1SUB(JNIEnv *env, jobject obj, jint a, jint b){
  int var = 0;
  var = DLL_API_SUB(a, b);
  return var;
}
JNIEXPORT jint JNICALL Java_com_test_jni_Java2cpp_DLL_1MUL(JNIEnv *env, jobject obj, jint a, jint b){
  int var = 0;
  var = DLL_API_MUL(a, b);
  return var;
}
JNIEXPORT jint JNICALL Java_com_test_jni_Java2cpp_DLL_1DIV(JNIEnv *env, jobject obj, jint a, jint b){
  int var = 0;
  var = DLL_API_DIV(a, b);
  return var;
}

(4)生成dll,在项目文件夹下的Debug文件夹内可以找到TestJNI.dll,但是因为我们在Java里要求dll名为JavaCallcpp,所以此时把项目重命名为JavaCallcpp,然后重新生成JavaCallcpp。【这一步生成会失败,按照如下添加路径】

6 调用方法

把第五步生成的JavaCallcpp.dll拷进JRE安装路径下的bin文件夹内,运行java程序即可。结果如下:

以上所述是小编给大家介绍的Java如何调用C++ DLL库的全部叙述,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • List、Map、Set接口在Java中的存取元素特点详细探讨

    List、Map、Set接口在Java中的存取元素特点详细探讨

    在Java编程语言中集合框架是处理对象组的重要工具,主要包括List、Set和Map接口,这些接口及其实现类提供了丰富的功能,这篇文章主要给大家介绍了关于List、Map、Set接口在Java中的存取元素特点,需要的朋友可以参考下
    2024-08-08
  • Java编程获取经纬度之间距离的方法

    Java编程获取经纬度之间距离的方法

    这篇文章主要介绍了Java编程获取经纬度之间距离的方法,涉及Java数学运算的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • 不同方式遍历Map集合(全)

    不同方式遍历Map集合(全)

    大家都知道Map是一种以键值对的形式存在的集合,其中每个键映射到一个值,下面把Map遍历集合总结了一下给大家分享下,需要的朋友可以参考下
    2015-07-07
  • Java报错Java.net.SocketTimeoutException的几种解决方法

    Java报错Java.net.SocketTimeoutException的几种解决方法

    在 Java 网络编程中,SocketTimeoutException 通常表示在进行网络操作时,等待响应的时间超过了设定的超时时间,本文将深入探讨 Java.net.SocketTimeoutException 的问题,并为开发者和环境配置者提供详细的解决方案,需要的朋友可以参考下
    2024-10-10
  • 详解SpringCloud使用Consul做注册中心

    详解SpringCloud使用Consul做注册中心

    这篇文章主要介绍了SpringCloud使用Consul做注册中心,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Java中保留两位小数的四种方法实现实例

    Java中保留两位小数的四种方法实现实例

    今天小编就为大家分享一篇关于Java中保留两位小数的四种方法实现实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • Java字符串split使用方法代码实例

    Java字符串split使用方法代码实例

    这篇文章主要介绍了Java字符串split使用方法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • RocketMQ的两种消费模式详解

    RocketMQ的两种消费模式详解

    这篇文章主要介绍了RocketMQ的两种消费模式详解,RocketMQ主要提供了两种消费模式,集群消费以及广播消费,我们只需要在定义消费者的时候通过setMessageModel(MessageModel.XXX),需要的朋友可以参考下
    2023-10-10
  • Springboot整合redis实现发布订阅功能介绍步骤

    Springboot整合redis实现发布订阅功能介绍步骤

    发布订阅作为一种设计思想在很多开源组件中都有体现,比如大家熟知的消息中间件等,可谓把发布订阅这一思想体现的淋漓尽致了
    2022-09-09
  • Java9新特性对HTTP2协议支持与非阻塞HTTP API

    Java9新特性对HTTP2协议支持与非阻塞HTTP API

    这篇文章主要为大家介绍了Java9新特性对HTTP2协议的支持与非阻塞HTTP API,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03

最新评论