利用JNative实现Java调用动态库

由于项目要求,需要用Java调用windows的dll文件,查了一下,如果用JNI的话是比较麻烦的,在sourceforge.net上搜索了一下“Java dll”,首先出现的是Jnative,于是决定用它,后来也试了些别的,但还是JNative好使,简单总结如下:

Java调用动态库所需要关心的问题:
l 如何装载dll文件,以及如何定位所要使用的方法;

l 数据类型是如何对应的;

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

l 如何获取返回的值。

JNative INFO:
Resource URL: http://jnative.sourceforge.net/

Source Code: http://sourceforge.net/projects/jnative

Detailed Review: http://jnative.free.fr

JavaDOC: http://jnative.free.fr/docs/

Version:1.3

一个开源的组件,通过它调用已有动态库中的方法就非常的方便,支持CallBack 。

为什么选择JNative
同类的开源组件相对活跃的还有,JNA ( Java Native Access ), Jawin,Nativecall,etc.但是Jnative 相对更容易使用,它对数据类型的处理做的更好。

l JNA 需要用户对所使用的DLL文件事先进行封装,才能装载。另外需要在一个java接口中描述目标DLL中的函数与结构,从而使JNA自动实现Java接口到native function的映射,较麻烦。

l Nativecall 暂时还不知道如何装载dll文件。

l Jawin 数据类型匹配相当敏感,它采用一种叫做”instruction string”的格式来传递参数,还没有完全理解。

How to:
解压JNative-1.3.2.zip 获得三个文件,分别是:JNativeCpp.dll,libJNativeCpp.so,JNative.jar 。


JNativeCpp.dll Windows下用的,拷到windows / system32目录下;

libJNativeCpp.so Linux下的咚咚;

JNative.jar 这是一个扩展包,将其copy到C:\jdk\jre\lib\ext 下(我的目录结构),系统会自动加载。

结构映射(Structure Mapping)


Type
Length
JNative class

DWORD
4
org.xvolks.jnative.misc.basicStructures.LONG

HWND
4
org.xvolks.jnative.misc.basicStructures.HWND

COLORREF
4
org.xvolks.jnative.misc.basicStructures.LONG

COLORREF*
4
org.xvolks.jnative.pointers.Pointer

LPARAM
4
org.xvolks.jnative.misc.basicStructures.LPARAM

LPCCHOOKPROC
4
org.xvolks.jnative.util.Callback

LPCTSTR
4
org.xvolks.jnative.pointers.Pointer



一些关键的类及方法

Class
作用
一般用到的方法(参数略,参考Doc)

org.xvolks.jnative.Jnative
装载dll文件,定位函数
JNative(),setParameter(),setRetVal(),getRetVal() etc.

org.xvolks.jnative.pointers.Pointer
替代本地函数中的的指针,需要先申请一块内存空间,才能创建
Pointer(),dispose()

org.xvolks.jnative.pointers.memory.MemoryBlockFactory
申请一块内存空间
createMemoryBlock()

org.xvolks.jnative.exceptions.NativeException
抛出装载,定位等方面的异常


org.xvolks.jnative.Type
列举和管理Jnative需要的不同的数据类型



(二)

简单测试,Javadoc 下和官方网上有些例子,下面的是我随便从IC读卡程序中找了个DLL进行的测试:
SCReader.dll 下的SCHelp_HexStringToBytes()函数原型
SCREADER_API WINAPI long SCHelp_HexStringToBytes(

LPCTSTR pSrc,

BYTE* pTar,

int MaxCount

);

注意:dll文件需要放到System32下,否则可能找不到


通过Jnative 用java 来调用代码如下:

package onlyfun.dllcall;
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.pointers.Pointer;
import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;
import org.xvolks.jnative.Type;
public class UserCall {
/**
* return 转换成功的字节数
*/
static JNative Something = null;
static Pointer pointer;
public String getSomething(String pSrc, Pointer pTar, int MaxCount) throws NativeException, IllegalAccessException{

try{
if(Something == null){
pTar = new Pointer(MemoryBlockFactory.createMemoryBlock(36));
Something = new JNative("SCReader.DLL", "SCHelp_HexStringToBytes");
// 利用org.xvolks.jnative.JNative 来装载 SCReader.dll,并利用其SCHelp_HexStringToBytes方法
Something.setRetVal(Type.INT);
// 指定返回参数的类型
}
int i=0;
Something.setParameter(i++,pSrc);
Something.setParameter(i++,pTar);
Something.setParameter(i++,MaxCount);
System.out.println("调用的DLL文件名为:"+Something.getDLLName());
System.out.println("调用的方法名为:"+Something.getFunctionName());
//传值
Something.invoke();//调用方法
return Something.getRetVal();
}finally{
if(Something!=null){
Something.dispose();//释放
}
}
}
public Pointer creatPointer() throws NativeException{
pointer = new Pointer(MemoryBlockFactory.createMemoryBlock(36));
pointer.setIntAt(0, 36);
return pointer;
}

public static void main(String[] args) throws NativeException, IllegalAccessException {
UserCall uc = new UserCall();
String result = uc.getSomething("0FFFFF", uc.creatPointer(), 100);
System.err.println("转换成功的字节数为:"+result);
TestCallback.runIt();
}
}
JNativeHook2.1.0 JNativeHook 为 Java 程序提供全局的键盘和鼠标事件侦听功能。你可以来处理程序外的键盘输入和鼠标动作。 JNativeHook 使用了 JNI 技术调用了系统的方法来实现该功能,支持的系统也非常多,并且不用导入任何dll文件,只要导入jar文件夹下的jar包即可,非常方便。 立即下载

相关推荐

jnativehook-2.1.0-API文档-中文版.zip

赠送jar包:jnativehook-2.1.0.jar; 赠送原API文档:jnativehook-2.1.0-javadoc.jar; 赠送源代码:jnativehook-2.1.0-sources.jar; 赠送Maven依赖信息文件:jnativehook-2.1.0.pom; 包含翻译后的API文档:jnativehook-2.1.0-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.1stleg:jnativehook:2.1.0; 标签:1stleg、jnativehook、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

JNative的使用深入解析——环境配置

       JNative是一种能够使Java语言使调用DLL的一种技术,对JNI进行了封装,可能有些读者会有这样一个问题,JNative对JNI进行了封装,并且是一种跨语言的使用DLL,会不会在效率方面很不如人意,我可以用我使用Jnative的经验告诉你,不会!因为我用Jnative就是用来处理大量的数据调用,是基于实时数据库接口的调用。而实时数据库的数据量是非常大的。       废话少说...

607

jnativehook_java键盘钩子_hookapi_jnativehook_

钩子函数运用,结合java语言获取键盘、鼠标响应监控信息。

探索Java跨平台全局键盘钩子:JNativeHook

探索Java跨平台全局键盘钩子:JNativeHook 去发现同类优质开源项目:https://gitcode.com/ 在编程世界中,有时我们需要监听系统的键盘事件,这在开发桌面应用、自动化工具或者游戏外挂等场景尤为常见。Java虽然强大,但在跨平台的键盘钩子(Global Keyboard Hook)实现上却稍显乏力。然而, 项目的出现,弥补了这一短板,让我们能够轻松地在Java程序中实现全局...

gitblog_00070的博客 2223

Qt 5.9.1 32位下,手把手搞定周立功CAN二次开发库的加载与配置(含常见错误排查)

本文详细介绍了在Qt 5.9.1 32位环境下配置周立功CAN二次开发库的完整流程,包括环境准备、项目配置、常见错误排查及性能优化建议。特别针对MinGW 32bit环境,提供了.pro文件的精准配置和DLL部署策略,帮助开发者快速解决库文件匹配、编译报错和运行时问题,实现高效的CAN总线通信开发。

weixin_28717431的博客 356

Spring AI 实战:5 分钟搭建你的第一个 AI 应用(含完整代码)

能力关键 API适用场景基础对话简单问答、文本生成流式输出实时打字机效果@Bean模型需要调用外部工具结构化输出需要返回 Java 对象多轮对话聊天机器人场景Spring AI 让 Java 开发者可以用最熟悉的方式(Spring Boot + Maven)进入 AI 应用开发领域,不用学新语言,不用换框架,这是它最大的优势。但目前为止,我们的 AI 应用只能回答"它脑子里已有的知识"。如果让它读懂你自己的技术文档、公司内部知识库呢?这就是下一篇文章的主题——RAG(检索增强生成)实战。

qq_17204557的博客 643

jnativehook 简介、中文文档、中英对照文档 下载

jnativehook 简介、中文文档、中英对照文档 下载;jnativehook、com.1stleg、中文文档、中英对照文档、下载、包含jar包、原API文档、源代码、Maven依赖信息文件、翻译后的API文档、1stleg、jnativehook、中文文档、jar包、java;JNativeHook是一个为Java提供全局键盘和鼠标监听器的库。这将允许您监听全局快捷键或鼠标移动,否则使用纯Java是不可能实现的。为了完成这项任务,JNativeHook通过Java的本机接口利用依赖于平台的本机代码来创

寒水馨 · 轻量级技术文档 · hanshuixin.org 1379

基于深度强化学习的柔性作业车间动态调度

在追求敏捷和灵活的生产调度方面,处理不可预测的动态事件的能力变得越来越重要。与此同时,生产系统中的网络-物理融合产生了大量需要实时挖掘和分析的工业数据。为了便于这种实时控制,本研究提出了一种分层分布式的体系结构来解决动态柔性作业车间调度问题。采用双深度Q网络算法(DDQN)训练调度智能体,捕捉生产信息与调度目标之间的关系,为具有恒定任务到达的柔性作业车间实时做出调度决策。为了处理动态调度中问题的可变规格说明,提出了专门的状态和动作表示法。此外,还提出了一种代理奖励整形技术(surrogate reward

太剧烈的快乐与太剧烈的悲哀是有相同之点的——同样地需要远离人群! 1万+

java调用dll返回url_利用JNative实现Java调用dll动态库

由于项目要求,需要用Java调用windows的dll文件,查了一下,如果用JNI的话是比较麻烦的,在sourceforge.net上搜索了一下“Java dll”,首先出现的是Jnative,于是决定用它,后来也试了些别的,但还是JNative好使,简单总结如下:Java调用动态库所需要关心的问题:如何装载dll文件,以及如何定位所要使用的方法;数据类型是如何对应的;如何给使用的方法传递参数;如...

weixin_39938724的博客 159

C++详解 二叉树的三种遍历方式

上一篇文章,讲了二叉树的创建——C++实现 链表存储二叉树 接下来讲解二叉树的三种遍历方式:先序(前序)遍历、中序遍历、后序遍历,三种方式都是DFS(Depth First Search)深度优先搜索,核心思想都是函数的递归(栈),如果你能理解上面这篇文章中创建二叉树的具体过程,那么遍历就轻而易举 1.先序遍历 Former_Order_Traversel(BinTree_Node* p) { ...

weixin_43335392的博客 5371

(五)深入理解蓝牙BLE之“Beacon包格式详解”

蓝牙Beacon格式详解 本文重点在结合Bluetooth官网spec和几个例子来使beacon帧格式更加容易被理解。 广播帧格式: 首先beacon是蓝牙BLE广播包的一种,蓝牙广播帧格式如下: PS:其实BLE数据帧除了报头字段和数据字段定义与广播帧不同之外,前导/接入地址/长度/校验格式均相同。 广播帧数据字段格式: 数据字段最长为37个字节:6个字节的广播设备地址 + 31个字节广播数据。 广播数据的格式如下:AD Structure1 +AD Structure2 + .....

1万+

java 通过jnative调用dll

通过jnative调用dll 。 下截JNative组件 jnative.sourceforge.net/ 到这里下载JNative开源项目,我下载的是1.3.2 解压JNative.zip 获得三个文件,分别是:JNativeCpp.dll,libJNativeCpp.so,JNative.jar 。  JNativeCpp.dll Windows下用的,拷贝到wind

qqqwwwqw的专栏 1万+

MicroCap声学仿真介绍(三)-人耳的频率响应

这里需要注意的是,24mm我们会填为”24m”,这里的“m”是毫的意思,24m意思是24e-3,同理7.4mm我们可以填为7.4m,意思是7.4e-3。MicroCap声学库中,已内置“声源”模块和“管”模块,我们需要调用这两个模块,并用连接线将这两个模块连接到一起,完成仿真工作。上图中第一个图是在管的一端输入1Pa(94dBSPL)的信号,管的另一端的不同频率的声压大小的仿真结果。上述的结果跟我们的常识也是符合的。换言之,我们要仿真的目的是在管的一端加1pa的声压时,管的另一端不同频率下的声压分布。

山无忧的博客 1471

java调用dll动态库文件的一般总结

前一段时间,在项目需求中,需要调用一下第三方的动态库文件,下面是本人一些尝试的经历。   首先需要明白的是,在java中是不能直接调用动态库文件的,因为动态库文件是使用c或是c++编写的,作为一种跨     平台的编程语言,java提供了一些用来读取dll文件方法,   一种是直接用JNI,这种方法一般来说用的人比较少,因为其中涉及到c++调用文件的编写,这里就不再叙述,下面直接说我们java

kahhy的博客 2万+

一分钟了解 Claude Code

在 AI 编程工具百花齐放的 2026 年,凭借其终端原生、全项目理解、自主执行的核心能力,开辟了全新赛道。它不是要替代你的 IDE 或编辑器,而是成为你最强大的终端扩展,让你在熟悉的环境中,用自然语言驱动开发,专注创意,而非琐事。

h a 6 6 6 c k 为 你解决复杂难题! 2205

【YOLOs-CPP-图像分类部署】04-项目优化(加速部署)

本文详细介绍了将YOLO图像分类C++部署项目从CMake迁移到Visual Studio控制台应用的全过程。针对低配CPU性能瓶颈问题,作者通过替换多线程HPP代码为官方实现,并采用448x448固定输入尺寸优化推理速度。项目配置包含OpenCV和ONNX Runtime环境设置,实现了图像批量处理、分类结果显示及结果日志输出功能。关键步骤包括依赖库配置、DLL部署和代码调试,最终在Windows平台成功实现高效CPU推理。该方案显著提升了低配硬件的兼容性,为图像分类任务提供了稳定的部署解决方案。

深耕CV 354

java 调用dll动态库_java中调用 dll 动态库的简洁方法 JNative

Java中调用DLL方法,是通过JNI接口实现的,http://www.ibm.com/developerworks/cn/java/l-linux-jni/这里有详细的说明。大概是先用Java写一个接口类,然后用javah 生成一个xxx.h的c语言的头文件,然后用C实现这个头文件,在这个实现接口中调用其他已经实现的接口。我看到这个实现方法后,感觉怪怪的,这不是反过来了么?随后在网上看到了JN...

weixin_29314405的博客 685

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

java 动态库_java调用dll动态库文件的一般总结

前一段时间,在项目需求中,需要调用一下第三方的动态库文件,下面是本人一些尝试的经历。首先需要明白的是,在java中是不能直接调用动态库文件的,因为动态库文件是使用c或是c++编写的,作为一种跨 平台的编程语言,java提供了一些用来读取dll文件方法,一种是直接用JNI,这种方法一般来说用的人比较少,因为其中涉及到c++调用文件的编写,这里就不再叙述,下面直接说我们java程序员常用的两种...

weixin_39929721的博客 2147

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

JNative使用,调用动态库

由于项目需要,使用读卡机,C++没学好,一些动态库使用起来很困难,在网上搜了好久发现JNative是一个很好的选择,简单,方便,只需要简单的几步就能很好调用动态库,下面是我写一段测试代码:package JNative;import java.io.IOException;import java.util.StringTokenizer;import org.xvo

BinTime的专栏 9175

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

java利用jnative调用dll动态库

最近公司有个需求,需要写一个webservice接口调用dll,之前没接触过,在网上找了找,然后遇到一些问题,感觉第一次弄的话还是有不少麻烦,这里整理遇到的一些问题,分享一下。 java调用dll动态库是有几种方式的,我这里选择的是jnative,下面附上代码。 注意点:jdk选择的是32位1.7版本,tomcat容器选择的是32位7版本 然后接口写完,在不同的机器上部署都出现不同的报错情况...

weixin_38001021的博客 1290

JNative:JAVA调用DLL

为了在Java开发环境中使用DCMTK,做了一下工作: (1)选择Java调用C++的工具  通过比较和测试JNI、JNA、BridJ、SWIG和JNative,考虑易用性和功能性,选择了JNative (  a.下载jnative.jar 及JNativeCpp.dll ;  b.将使用的dll文件及JNativeCpp.dll拷贝至系统system32下或项目根目录,一定

dcxhun3的博客 1864
上一篇: JAVA调用动态库方法说明
下一篇: Java调用动态库最简便方法和最好用的组件
lele521
博客等级 码龄20年 0粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值