- 浏览: 985651 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (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 1013调试jdk中的源码,查看jdk局部变量 2012-04 ... -
Eclipse快捷键 10个最有用的快捷键<转>
2013-04-11 23:28 1011Eclipse中10个最有用的快捷键组合 一个Eclip ... -
Lucene 3.6 中文分词、分页查询、高亮显示等
2012-12-09 23:35 17731、准备工作 下载lucene 3.6.1 : htt ... -
Maven实战(九)——打包的技巧(转)
2012-10-12 00:41 899“打包“这个词听起 ... -
基于Maven的web工程如何配置嵌入式Jetty Server开发调试环境(转)
2012-10-12 00:28 8721、首先在web工程的POM文件里添加依赖jar包如下: ... -
轻轻松松学Solr(1)--概述及安装[转]
2012-09-18 14:59 950概述 这段时间对企 ... -
分析Netty工作流程[转]
2012-09-04 19:02 846下面以Netty中Echo的例 ... -
让eclipse在ubuntu下面好看一点
2012-03-27 10:17 883<p> </p> <h1 cla ... -
zookeeper安装和应用场合(名字,配置,锁,队列,集群管理)[转]
2012-01-12 17:59 1615安装和配置详解 本文 ... -
Jakarta-Common-BeanUtils使用笔记[转]
2012-01-10 14:13 1120Jakarta-Common-BeanUtils ... -
一个关于Java Thread wait(),notify()的实用例【转】
2012-01-07 16:05 984///// // ProducerConsume ... -
Java基础:Java中的 assert 关键字解析【转】
2012-01-06 19:50 976J2SE 1.4在语言上提供了 ... -
一篇不错的讲解Java异常的文章(转载)----感觉很不错,读了以后很有启发[转]
2012-01-06 15:02 1217六种异常处理的陋习 ... -
如何解决HP QC(Quality Center)在Windows 7下不能工作的问题
2011-12-26 10:48 1538HP QC(Quantity Center) 是一款不错的测 ... -
JAVA读写文件,中文乱码 【转】
2011-12-19 23:43 2073最近在做HTML静态生成,需要从硬盘上把模版文件的内容读出来。 ... -
Java 6 JVM参数选项大全(中文版)【转】
2011-12-19 19:51 927Java 6 JVM参数选项大全(中文版) 作者 ... -
使用assembly plugin实现自定义打包【转】
2011-12-13 01:58 925在上一篇文章中,讨论到在对maven的机制不熟悉的情况下,为了 ... -
使用maven ant task实现非标准打包[转]
2011-12-13 01:56 1005maven很强大,但是总有些事情干起来不是得心应手,没有使用a ... -
Java日期转换SimpleDateFormat格式大全【转】
2011-12-08 20:22 126524小时制时间 显示: public clas ... -
使用Spring的表单标签库
2011-11-22 20:08 103413.9. 使用Spring的 ...
相关推荐
由于项目要求,需要用Java调用windows的dll...Java调用动态库所需要关心的问题: l 如何装载dll文件,以及如何定位所要使用的方法; l 数据类型是如何对应的; l 如何给使用的方法传递参数; l 如何获取返回的值。
由于项目要求,需要用Java调用windows的...Java调用动态库所需要关心的问题: l 如何装载dll文件,以及如何定位所要使用的方法; l 数据类型是如何对应的; l 如何给使用的方法传递参数; l 如何获取返回的值。
java程序需要的类能够动态的被载入到运行环境,也可以通过网络来载入所需 要的类。安全性,java通常被用在网络环境宏,为此,java提供了一个安全机制加以防 恶意代码的攻击。除了java语言具有的许多安全特性以外,...
点量网络性能检测库SDK开发包使用高效的c++代码编写,提供标准的动态链接库(DLL),可供C/C++、JAVA、C#、Delphi、VB、Borland C++等语言和各常用开发环境调用,让您完全像调用系统API一样的调用。
目前点量BT已经在多家客户的网吧游戏更新系统 / 教育视频BT下载系统中应用. <br>点量BT源码使用高效的c++代码编写,提供标准的动态链接库(DLL),可供C/C++、Delphi、C#、Java、VB等语言和各常用开发环境调用,...
点量Http、FTP多线程断点续传下载...点量Http、FTP下载内核源码使用高效的c++代码编写,提供标准的动态链接库(DLL),可供C/C++、Delphi、C#、Java、VB等语言和各常用开发环境调用,让您完全像调用系统API一样的调用。
该BT SDK的开发目的是让用户...源码使用高效的c++代码编写,提供标准的动态链接库(DLL),可供C/C++、Delphi、C#、Java、VB、Borland C++等语言和各常用开发环境调用。 下载速度快,资源占用极低, 稳定,功能完善...
用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。 二、头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,...
需要将 J2EE 用对地方,那么只有理解 J2EE 此类框架软件的精髓,那么你才能真正灵活应用 Java 解决你的问题,甚至构架出你自 己企业的框架来。(我们不能总是使用别人设定好的框架,为什么不能有我们自己的框架?) ...
委托实例的一个有趣和有用的属性是它不了解或不关心它所封装的方法的类;真正重要的只是方法要与委托的类型兼容, 这使委托非常适合“匿名”调用。可选的形参表指定委托的参数,而返回类型则指示委托的返回类型。如果...
点量Http、FTP下载内核源码使用高效的c++代码编写,提供标准的动态链接库(DLL),可供C/C++、Delphi、C#、Java、VB等语言和各常用开发环境调用,让您完全像调用系统API一样的调用。 点量Http/FTP组件的功能简介...
Java的产生与流行是当今Internet发展的客观要求,Java是一门各方面性能都很好的编程语言,它的基本特点是简单、面向对象、分布式、解释的、健壮的、安全的、结构中立的、可移植的、性能很优异的、多线程的、动态的,...
用户可以显示所关心的代码,并通过对执行未覆盖的路径的观察得到有关的信息。信息以图形(控制流图)和文本(伪代码和源文件)的形式提交,并在其间建立导航关联。 TestChecker 管理系统声明新的测试、生成有关文档...
动态类型检查最大限度允许多态出现,并自动简化调用内存管理的接口,因为这样不需要关心谁来分配内存谁来释放内存,也不必担心数据溢出。高级函数和匿名函数均可以接受高级参数,使函数更为通用。 Lua自带一个小规模...
在对内存块进行了 free 调用之后,我们需要做的是诸如将它们标记为未被使用的等事情,并且,在调用 malloc 时,我们要能够定位未被使用的内存块。因此, malloc 返回的每块内存的起始处首先要有这个结构: 清单 3...
18.2 在 C #代码中调用 C++和 VB 编写的组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间...
作者通过总结各自多年的软件开发和教学培训经验,与大家分享了掌握Oracle SQL所独有的丰富功能的技巧所在,内容涵盖SQL执行、联结、集合、分析函数、子句、事务处理等多个方面。读者可以学习到以下几个方面的技巧:...
点量Http、FTP下载内核源码使用高效的c++代码编写,提供标准的下载动态链接库(DLL),可供C/C++、Delphi、C#、Java、VB等语言和各常用开发环境调用,让您完全像调用系统API一样的调用。点量Http/FTP组件的功能简介...