- 浏览: 1011228 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (826)
- 硬件 (8)
- 软件 (24)
- 软件工程 (34)
- JAVA (229)
- C/C++/C# (77)
- JavaScript (8)
- PHP (1)
- Ruby (3)
- MySQL (14)
- 数据库 (19)
- 心情记事 (12)
- 团队管理 (19)
- Hadoop (1)
- spring (22)
- mybatis(ibatis) (7)
- tomcat (16)
- velocity (0)
- 系统架构 (6)
- JMX (8)
- proxool (1)
- 开发工具 (16)
- python (10)
- JVM (27)
- servlet (5)
- JMS (26)
- ant (2)
- 设计模式 (5)
- 智力题 (2)
- 面试题收集 (1)
- 孙子兵法 (16)
- 测试 (1)
- 数据结构 (7)
- 算法 (22)
- Android (11)
- 汽车驾驶 (1)
- lucene (1)
- memcache (12)
- 技术架构 (7)
- OTP-Erlang (7)
- memcached (17)
- redis (20)
- 浏览器插件 (3)
- sqlite (3)
- Heritrix (9)
- Java线程 (1)
- scala (0)
- Mina (6)
- 汇编 (2)
- Netty (15)
- libevent (0)
- CentOS (12)
- mongod (5)
- mac os (0)
最新评论
-
kingasdfg:
你这里面存在一个错误添加多个任务 应该是这样的 /** * ...
Quartz的任务的临时启动和暂停和恢复【转】 -
kyzeng:
纠正一个错误,long型对应的符号是J,不是L。
Jni中C++和Java的参数传递 -
zhaohaolin:
抱歉,兄弟,只是留下作记录,方便学习,如果觉得资料不好,可以到 ...
netty的个人使用心得【转】 -
cccoooccooco:
谢谢!自己一直以为虚机得使用网线才可以与主机连接呢。。
主机网卡无网线连接与虚拟机通信 -
yuqilin001:
要转别人的东西,请转清楚点嘛,少了这么多类,误人子弟
netty的个人使用心得【转】
标签: 无标签
利用JNative实现Java调用动态库(转)
http://cctv663.blog.163.com/blog/static/101192122008673218691/
由于项目要求,需要用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
();
}
}
发表评论
-
调试jdk中的源码,查看jdk局部变量
2013-06-15 23:30 1048调试jdk中的源码,查看jdk局部变量 2012-04 ... -
Eclipse快捷键 10个最有用的快捷键<转>
2013-04-11 23:28 1070Eclipse中10个最有用的快捷键组合 一个Eclip ... -
Lucene 3.6 中文分词、分页查询、高亮显示等
2012-12-09 23:35 18101、准备工作 下载lucene 3.6.1 : htt ... -
Maven实战(九)——打包的技巧(转)
2012-10-12 00:41 932“打包“这个词听起 ... -
基于Maven的web工程如何配置嵌入式Jetty Server开发调试环境(转)
2012-10-12 00:28 9161、首先在web工程的POM文件里添加依赖jar包如下: ... -
轻轻松松学Solr(1)--概述及安装[转]
2012-09-18 14:59 990概述 这段时间对企 ... -
分析Netty工作流程[转]
2012-09-04 19:02 883下面以Netty中Echo的例 ... -
让eclipse在ubuntu下面好看一点
2012-03-27 10:17 914<p> </p> <h1 cla ... -
zookeeper安装和应用场合(名字,配置,锁,队列,集群管理)[转]
2012-01-12 17:59 1647安装和配置详解 本文 ... -
Jakarta-Common-BeanUtils使用笔记[转]
2012-01-10 14:13 1153Jakarta-Common-BeanUtils ... -
一个关于Java Thread wait(),notify()的实用例【转】
2012-01-07 16:05 1019///// // ProducerConsume ... -
Java基础:Java中的 assert 关键字解析【转】
2012-01-06 19:50 1056J2SE 1.4在语言上提供了 ... -
一篇不错的讲解Java异常的文章(转载)----感觉很不错,读了以后很有启发[转]
2012-01-06 15:02 1259六种异常处理的陋习 ... -
如何解决HP QC(Quality Center)在Windows 7下不能工作的问题
2011-12-26 10:48 1574HP QC(Quantity Center) 是一款不错的测 ... -
JAVA读写文件,中文乱码 【转】
2011-12-19 23:43 2115最近在做HTML静态生成,需要从硬盘上把模版文件的内容读出来。 ... -
Java 6 JVM参数选项大全(中文版)【转】
2011-12-19 19:51 966Java 6 JVM参数选项大全(中文版) 作者 ... -
使用assembly plugin实现自定义打包【转】
2011-12-13 01:58 965在上一篇文章中,讨论到在对maven的机制不熟悉的情况下,为了 ... -
使用maven ant task实现非标准打包[转]
2011-12-13 01:56 1045maven很强大,但是总有些事情干起来不是得心应手,没有使用a ... -
Java日期转换SimpleDateFormat格式大全【转】
2011-12-08 20:22 130924小时制时间 显示: public clas ... -
使用Spring的表单标签库
2011-11-22 20:08 106713.9. 使用Spring的 ...
相关推荐
Java调用串口文件在开发过程中常常用于与硬件设备进行通信,例如读写串行端口数据。在处理这类需求时,Java社区提供了一个开源库RXTX,它允许Java程序与串行(COM)和并行(LPT)端口进行交互。RXTX库包括两个关键的...
标题中提到的"Jna调用动态库相关jar包"是指JNA库的两个主要组件:jna-3.5.1.jar和platform-3.5.1.jar。这两个jar文件是JNA框架的一部分,用于在Java程序中实现对本地库的调用。 1. **jna-3.5.1.jar**:这是JNA的...
Web服务(WebService)是一种基于互联网的、平台独立的交互方式,允许不同的系统之间进行数据...动态调用使得客户端无需关心服务端的具体实现,只需要知道服务的接口描述,这对于大型系统的开发和维护具有重要意义。
这些库在原生的C++环境中被广泛使用,但在Java中使用时往往需要复杂的JNI(Java Native Interface)调用。JavaCV通过提供简洁的Java接口,使得在Java中使用这些库变得更加便捷。 1. **OpenCV**:OpenCV是一个开源的...
由于项目要求,需要用Java调用windows的dll...Java调用动态库所需要关心的问题: l 如何装载dll文件,以及如何定位所要使用的方法; l 数据类型是如何对应的; l 如何给使用的方法传递参数; l 如何获取返回的值。
由于项目要求,需要用Java调用windows的...Java调用动态库所需要关心的问题: l 如何装载dll文件,以及如何定位所要使用的方法; l 数据类型是如何对应的; l 如何给使用的方法传递参数; l 如何获取返回的值。
这个包中的`opencv-454.jar`文件是Java版的OpenCV库,它允许Java开发者直接在Java代码中调用OpenCV的功能,从而无需关心底层的C++实现细节。 其次,`libopencv_java454.so`是一个动态链接库文件,它是OpenCV与Java...
这涉及到创建C/C++的桥接代码,编译成动态链接库,然后在Java中通过`System.loadLibrary()`加载。 - 如果是JAR库,直接将其添加到Java项目的类路径中,然后通过Java代码调用相应的类和方法。 2. **API使用**: - ...
### JAVA调用SAP函数指南:深入解析与实践 #### 概览 在现代企业级应用开发中,Java与SAP系统的集成变得日益重要。本文档《JAVA调用SAP函数指南》旨在提供一个全面而深入的理解框架,帮助开发者掌握如何通过Java...
在RPC框架中,我们需要选择合适的序列化库,将方法调用信息和结果对象转化为字节流,以便在网络中传输。 5. **服务注册与发现**:在大型分布式系统中,服务提供者通常会有多台机器实例。服务注册与发现机制可以帮助...
在本项目中,Java代码被用来调用RapidOCR,这是一种基于PaddleOCR的OCR(光学字符识别)工具。RapidOCR是由百度开发的高效、轻量级的OCR引擎,而PaddleOCR则是其底层的深度学习框架。PaddleOCR不仅提供强大的文字...
标签中的"ZeroMQ DLL 动态库 编译完成"进一步强调了这是预编译好的DLL文件,已经完成了编译过程,开发者可以直接利用它们,而无需关心编译步骤。 压缩包内的文件名"Win32"和"x64"表明了包含的库分别对应于32位和64...
由于这是一个编译好的库,开发者不需要关心编译过程中的依赖问题,只需关注如何在自己的Java代码中正确使用它。 总的来说,Java CEF Win64 MP4.zip为Java开发者提供了一种简单、高效的方式来在他们的64位Windows...
本地方法接口(JNI)允许Java代码调用非Java语言编写的代码,如C或C++编写的本地库。这对于那些需要访问操作系统底层功能或者调用已有C/C++库的应用非常有用。 - **JNI的作用**:通过JNI,开发者可以利用现有C/C++...
Java编程实验:远程方法调用(RMI...通过这个实验,学生将深入理解Java RMI的工作原理,包括远程对象的创建、注册、调用,以及如何处理网络通信中的序列化和反序列化问题。这为构建更复杂的分布式系统打下坚实的基础。
`JNativeCpp.dll`可能是实现了Java Native Interface (JNI) 的C++动态库,允许Java代码调用C或C++编写的函数,这在处理性能敏感的代码或利用现有库时非常有用。在这里,JNative可能被用来封装对EDNA数据库的操作,...
- GDAL Java包是GDAL库的Java接口,它允许Java开发者直接调用GDAL的C++接口,无需关心底层实现细节。 - 这个包提供了广泛的GIS操作,包括栅格和矢量数据的读写,投影转换,图像处理,以及复杂的地理空间分析。 2....
在实际应用中,开发者需要将`libopencv_java3411.so`放在系统的动态链接库搜索路径下,或者在运行时通过`LD_LIBRARY_PATH`环境变量指定其位置。同时,将`opencv-3411.jar`添加到项目的类路径(ClassPath)中,以便...
在Java中,我们通常需要通过JNI调用C/C++编写的动态链接库(DLL)来设置和处理这些钩子。 2. **JNI(Java Native Interface)**:JNI是Java平台的标准部分,它允许Java代码和其他语言写的代码进行交互。在本项目中...