`
zhaohaolin
  • 浏览: 985651 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

    博客分类:
  • JAVA
 
阅读更多

标签: 无标签

利用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 ();
    }
}

分享到:
评论

相关推荐

    Jnative-1.3.2及心得

    由于项目要求,需要用Java调用windows的dll...Java调用动态库所需要关心的问题: l 如何装载dll文件,以及如何定位所要使用的方法; l 数据类型是如何对应的; l 如何给使用的方法传递参数; l 如何获取返回的值。

    JNative_1.4RC3_src

    由于项目要求,需要用Java调用windows的...Java调用动态库所需要关心的问题: l 如何装载dll文件,以及如何定位所要使用的方法; l 数据类型是如何对应的; l 如何给使用的方法传递参数; l 如何获取返回的值。

    基于Java的XML解析与反射设计模式.doc

    java程序需要的类能够动态的被载入到运行环境,也可以通过网络来载入所需 要的类。安全性,java通常被用在网络环境宏,为此,java提供了一个安全机制加以防 恶意代码的攻击。除了java语言具有的许多安全特性以外,...

    点量网络性能检测库SDK开发包

    点量网络性能检测库SDK开发包使用高效的c++代码编写,提供标准的动态链接库(DLL),可供C/C++、JAVA、C#、Delphi、VB、Borland C++等语言和各常用开发环境调用,让您完全像调用系统API一样的调用。

    点量BT内核开发包SDK

    目前点量BT已经在多家客户的网吧游戏更新系统 / 教育视频BT下载系统中应用. <br>点量BT源码使用高效的c++代码编写,提供标准的动态链接库(DLL),可供C/C++、Delphi、C#、Java、VB等语言和各常用开发环境调用,...

    点量Http/FTP多线程断点续传下载组件DLL

    点量Http、FTP多线程断点续传下载...点量Http、FTP下载内核源码使用高效的c++代码编写,提供标准的动态链接库(DLL),可供C/C++、Delphi、C#、Java、VB等语言和各常用开发环境调用,让您完全像调用系统API一样的调用。

    成熟的BT/P2P开发包SDK

    该BT SDK的开发目的是让用户...源码使用高效的c++代码编写,提供标准的动态链接库(DLL),可供C/C++、Delphi、C#、Java、VB、Borland C++等语言和各常用开发环境调用。 下载速度快,资源占用极低, 稳定,功能完善...

    电子类软硬件面试集锦

    用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。 二、头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,...

    二十三种设计模式【PDF版】

    需要将 J2EE 用对地方,那么只有理解 J2EE 此类框架软件的精髓,那么你才能真正灵活应用 Java 解决你的问题,甚至构架出你自 己企业的框架来。(我们不能总是使用别人设定好的框架,为什么不能有我们自己的框架?) ...

    c#学习笔记.txt

    委托实例的一个有趣和有用的属性是它不了解或不关心它所封装的方法的类;真正重要的只是方法要与委托的类型兼容, 这使委托非常适合“匿名”调用。可选的形参表指定委托的参数,而返回类型则指示委托的返回类型。如果...

    Http/FTP多线程断点续传下载组件

    点量Http、FTP下载内核源码使用高效的c++代码编写,提供标准的动态链接库(DLL),可供C/C++、Delphi、C#、Java、VB等语言和各常用开发环境调用,让您完全像调用系统API一样的调用。 点量Http/FTP组件的功能简介...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    Java的产生与流行是当今Internet发展的客观要求,Java是一门各方面性能都很好的编程语言,它的基本特点是简单、面向对象、分布式、解释的、健壮的、安全的、结构中立的、可移植的、性能很优异的、多线程的、动态的,...

    嵌入式软件测试工具--LOGISCOPE

    用户可以显示所关心的代码,并通过对执行未覆盖的路径的观察得到有关的信息。信息以图形(控制流图)和文本(伪代码和源文件)的形式提交,并在其间建立导航关联。 TestChecker 管理系统声明新的测试、生成有关文档...

    Programming_In_Lua.doc(word版本,带完整文档结构图)

    动态类型检查最大限度允许多态出现,并自动简化调用内存管理的接口,因为这样不需要关心谁来分配内存谁来释放内存,也不必担心数据溢出。高级函数和匿名函数均可以接受高级参数,使函数更为通用。 Lua自带一个小规模...

    操作系统(内存管理)

    在对内存块进行了 free 调用之后,我们需要做的是诸如将它们标记为未被使用的等事情,并且,在调用 malloc 时,我们要能够定位未被使用的内存块。因此, malloc 返回的每块内存的起始处首先要有这个结构: 清单 3...

    C#微软培训资料

    18.2 在 C #代码中调用 C++和 VB 编写的组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    作者通过总结各自多年的软件开发和教学培训经验,与大家分享了掌握Oracle SQL所独有的丰富功能的技巧所在,内容涵盖SQL执行、联结、集合、分析函数、子句、事务处理等多个方面。读者可以学习到以下几个方面的技巧:...

    点量Http/Ftp下载组件 v3.3

    点量Http、FTP下载内核源码使用高效的c++代码编写,提供标准的下载动态链接库(DLL),可供C/C++、Delphi、C#、Java、VB等语言和各常用开发环境调用,让您完全像调用系统API一样的调用。点量Http/FTP组件的功能简介...

Global site tag (gtag.js) - Google Analytics