我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java如何调用dll文件

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java如何调用dll文件

这篇文章主要介绍Java如何调用dll文件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

Java调用dll文件

近期根据C++做了一个图片质量检测的项目,目前需要在在java中进行调用,所以先在C++上生成dll文件,然后基于java调用dll文件实现功能。

环境

C++:VS2017(之前配置opencv真是要了老命)

java:idea2020+jdk1.8。

注意:jdk安装的时候小心点,path路径容易点编辑,千万别新建,会覆盖的。

Java如何调用dll文件

接下来进入正文

创建Java项目,假设定义HelloWorld函数,其中“winproject1”是等会要调用的dll文件,现在进入cmd并cd到当前目录下面,然后javah -jni HelloWorld.HelloWorld,这样会在目录下面生成一个HelloWorld_HelloWorld.h。

等会需要将这个头文件移到之前安装jdk目录里的include下面,如:D:%你的路径%\Java\include。

Java如何调用dll文件

Java如何调用dll文件

打开vs2017,创建一下新的控制台项目,然后需要配置项目包含目录的路径,将下面两个路径加进去,保险点还可以在附加目录里面加上这些路径。

vs2017中编写上面头文件中的代码:

JNIEXPORT void JNICALL Java_HelloWorld_HelloWorld_sayHello (JNIEnv *, jobject, jstring, jstring, jstring, jstring) { cout<<"hello world!"<<endl; }

Java如何调用dll文件

Java如何调用dll文件

Java如何调用dll文件

**注:**其中#include "single_check.h"就是我定义检测函数的头文件,在下面的函数中可以调用自己定义的函数,从而让java执行里面的内容,可以调用函数。

生成第一步中提到的winproject1.dll文件,直接点击生成-生成解决方案,便可以在项目路径(%项目名%\x64\Debug\winproject1.dll)中找到dll文件,并且复制到jdk安装路径的bin文件夹下(D:%你的路径%\Java\bin\)

最后一步最简单啦,在java里面直接run就行啦。最后看一下结果!完美!

Java如何调用dll文件

Java如何调用dll文件

这是windows下用java调用dll文件,接下来要实现跨平台调用,得在linux下用java可以实现改功能。头秃啊

Java调用dll文件几种常见方式

Java调用动态库需要关注的问题

如何装载DLL文件,以及如何定位所要使用的方法;

数据类型如何对应;

如何给使用的方法传递参数;

如何获取返回的值。

一.数据类型对应关系

Java TypeC Type
booleanint
bytechar
charwchar_t
shortshort
doubledouble
floatfloat
Stringchar*

二.Jnative调用dll

Jnative是对JNI技术进行了封装,更加方便的让java去调用DLL。

下载Jnative库,其中包含JNative.jar, JNativeCPP.dll, JNativeCPP.so这三个包。 JNative.jar是需要导入到Java工程的lib下, JNativeCPP.dll文件放在jdk安装目录下,或者是user\System32目录下,或者项目根目录下。

将需要调用的dll动态链接库放在SYSTEM32文件夹下,或者是项目根目录下,否则会出现找不到dll文件的错误。

加载DLL库 : System.loadLibrary("TranferEth"); // TransferEth为需要调用的DLL文件,只需要使用DLL文件的文件名即可。

调用DLL入口函数 : JNative jnt = new JNative("TransferEth.dll", "Transfer_Ethernet"); // 参数1为需要调用的DLL文件, 参数2为需要调用的方法。

设置返回参数类型 : jnt.setVal(Type.INT);

设置传入参数 : jnt.setParameter(0, "TransferScale.ini");

执行调用 : jnt.invoke();

释放资源 : jnt.dispose();

三.JNA调用dll  

JJNA中,它提供了一个动态的C语言编写的转发器,可以自动实现Java和C的数据类型映射。你不再需要编写C动态链接库。  

在java项目中引入jna.jar。 (当前引用的版本为3.4.0 , 之前的版本未提供释放动态链接库资源的方法)

定义调用接口, 接口方法与需要调用的DLL提供的外部函数一致。

例如:DLL文件中提供入口函数:

extern "C" __declspec(dllexport) UINT __stdcall Transfer_Ethernet_EX(char *cTransScale , int nKey);extern "C" __declspec(dllexport) UINT __stdcall Transfer_Ethernet(char *cTransScale );

则定义的接口类中如下:  (数据类型对应关系如上)

public interface CallMTScaleLibrary extends Library {      public int Transfer_Ethernet_EX(String filename, int key);         public int Transfer_Ethernet(String filename); }

加载DLL文件

String dir = path + "dllName";  // dll文件的路径,可以省略后缀名,dll和so后缀都可以加载CallMTScaleLibrary scaleLibrary =  (CallMTScaleLibrary) Native.loadLibrary(dir, CallMTScaleLibrary.class);

执行调用

int result = scaleLibrary.Transfer_Ethernet(path + "TransferScale.ini");

释放资源

一次调用完成后需要释放掉资源,以便后续重复调用该资源。通过查看jna的源码Native类中有私有方法dispose()可以主动释放掉资源,可以通过反射的方式去调用该方法,也可以重写该方法,从而实现释放。

private static void  dispose(){           NativeLibrary.disposeAll();                    nativeLibraryPath = null;}

注意问题:

文件路径:DLL文件最好放在项目的根目录下,或者是system32文件夹下,必须在环境变量配置的path中。                 

循环调用:当循环调用同一个DLL文件时,必须要释放掉上一次的资源,否则会被占用端口(每次调用都会在线程里进行一次网络通讯)。 

以上是“Java如何调用dll文件”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java如何调用dll文件

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java如何调用dll文件

这篇文章主要介绍Java如何调用dll文件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Java调用dll文件近期根据C++做了一个图片质量检测的项目,目前需要在在java中进行调用,所以先在C++上生成dll文件,
2023-06-29

c#怎么调用dll文件

可在 c# 中轻松调用 dll 文件:引用 dll(使用 dllimport 特性)定义与 dll 函数签名匹配的函数原型调用 dll 函数(如同 c# 函数)附加技巧:使用 charset 指定字符串参数字符集使用 callingconv
c#怎么调用dll文件
2024-05-14

python调用dll文件接口

转载在Python中某些时候需要C做效率上的补充,在实际应用中,需要做部分数据的交互。使用python中的ctypes模块可以很方便的调用windows的dll(也包括linux下的so等文件),下面将详细的讲解这个模块(以windows平
2023-01-31

dll文件放在哪该如何注册dll文件

假如你在打开游戏或者软件时提示缺少某个.dll文件,通常是下载这个dll文件复制到“ X:\Windows\system32 ”,大部分人的系统是装在C盘,就把文件复制到 “ C:\Windows\sys
2023-05-25

Visual Studio 2010如何调用非C#编写的DLL文件

这篇文章主要介绍“Visual Studio 2010如何调用非C#编写的DLL文件”,在日常操作中,相信很多人在Visual Studio 2010如何调用非C#编写的DLL文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法
2023-06-17

如何编辑dll文件

这篇文章给大家分享的是有关如何编辑dll文件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。编辑dll文件的方法:首先下载安装VB Decompiler Pro;然后进入软件主界面,点击界面上方菜单栏里的File选
2023-06-06

如何注册.dll文件

要注册一个.dll文件,你可以使用命令提示符来执行以下步骤:1. 打开命令提示符:在开始菜单中搜索“cmd”,然后点击“命令提示符”图标。2. 在命令提示符中,导航到包含.dll文件的目录。例如,如果.dll文件位于C:\Windows\S
2023-09-09

c#如何调用c++的DLL

这篇文章主要讲解了“c#如何调用c++的DLL”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“c#如何调用c++的DLL”吧!C#是托管型代码,创建的对象会自动回收。C++是非托管型代码,创建
2023-06-30

win11如何替换dll文件

这篇“win11如何替换dll文件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“win11如何替换dll文件”文章吧。1、一
2023-07-01

python调用易语言编写的dll文件

目前易语言编写的dll文件都是32位的dll,所以必须用32位的python去调用。    32位的dll必须用32位的python调用,64位的dll必须用64位的python调用。原因如下:    在64位的windows系统中,一个6
2023-01-31

C++ Builder如何调用Visual C++ DLL

C++ Builder如何调用Visual C++ DLL,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。使用C++Builder调用Visual C++ DLL 创建的DL
2023-06-17

Linux下如何调用dll& .so库

这篇文章主要介绍了Linux下如何调用dll& .so库,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。dll是Dynamic Link Library的缩写。DLL是一个包含
2023-06-28

C++如何封装成DLL并调用

这篇文章主要介绍“C++如何封装成DLL并调用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++如何封装成DLL并调用”文章能帮助大家解决问题。第一步:编写.cpp和.h文件本例工程名称为RunL
2023-07-05

如何用C#做中间语言实现Java调用.net DLL

如何用C#做中间语言实现Java调用.net DLL,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。51CTO曾经为大家讲过“Java与.NET的WebServices相互调
2023-06-17

win10缺少dll文件如何修复

要修复Win10缺少的DLL文件,请按照以下步骤进行操作:1. 重新启动电脑:有时候,重新启动可以解决一些问题,包括缺少DLL文件的问题。2. 运行系统文件检查器(SFC):SFC是Windows系统自带的一个工具,可以扫描和修复系统文件。
2023-09-28

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录