知识大全 利用JNative实现Java调用dll动态库

Posted 文件

篇首语:不要什么话都跟别人讲,你说的是心里话,他们听的是笑话。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 利用JNative实现Java调用dll动态库相关的知识,希望对你有一定的参考价值。

利用JNative实现Java调用dll动态库  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

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

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

  l         如何装载dll文件 以及如何定位所要使用的方法

  l         数据类型是如何对应的

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

  l         如何获取返回的值

  JNative INFO

  Resource URL:

  Source Code:

  Detailed Review:

  JavaDOC

  Version

  一个开源的组件 通过它调用已有动态库中的方法就非常的方便 支持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 zip 获得三个文件 分别是 JNativeCpp dll libJNativeCpp so JNative jar

  JNativeCpp dll Windows下用的 拷到windows / system 目录下

  libJNativeCpp so Linux下的咚咚

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

  结构映射(Structure Mapping)

  Type

  Length

  JNative class

  DWORD

  

   xvolks jnative misc basicStructures LONG

  HWND

  

   xvolks jnative misc basicStructures HWND

  COLORREF

  

   xvolks jnative misc basicStructures LONG

  COLORREF*

  

   xvolks jnative pointers Pointer

  LPARAM

  

   xvolks jnative misc basicStructures LPARAM

  LPCCHOOKPROC

  

   xvolks jnative util Callback

  LPCTSTR

  

   xvolks jnative pointers Pointer

  一些关键的类及方法

  Class

  作用

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

   xvolks jnative Jnative

  装载dll文件 定位函数

  JNative() setParameter() setRetVal() getRetVal() etc

   xvolks jnative pointers Pointer

  替代本地函数中的的指针 需要先申请一块内存空间 才能创建

  Pointer() dispose()

   xvolks mory MemoryBlockFactory

  申请一块内存空间

  createMemoryBlock()

   xvolks jnative exceptions NativeException

  抛出装载 定位等方面的异常

   xvolks jnative Type

  列举和管理Jnative需要的不同的数据类型

  (二)

  简单测试 Javadoc 下和官方网上有些例子 下面的是我随便从IC读卡程序中找了个DLL进行的测试

  SCReader dll 下的SCHelp_HexStringToBytes()函数原型

  SCREADER_API WINAPI long SCHelp_HexStringToBytes(

  LPCTSTR pSrc

  BYTE* pTar

  int MaxCount

  );

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

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

  package onlyfun dllcall;

  import xvolks jnative JNative;

  import xvolks jnative exceptions NativeException;

  import xvolks jnative pointers Pointer;

  import xvolks mory MemoryBlockFactory;

  import 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( ));

  Something = new JNative( SCReader DLL SCHelp_HexStringToBytes );

  // 利用 xvolks jnative JNative 来装载 SCReader dll 并利用其SCHelp_HexStringToBytes方法

  Something setRetVal(Type INT);

  // 指定返回参数的类型

  

  int i= ;

  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( ));

  pointer setIntAt( );

  return pointer;

  

  public static void main(String[] args) throws NativeException IllegalAccessException

  UserCall uc = new UserCall();

  String result = uc getSomething( FFFFF uc creatPointer() );

  System err println( 转换成功的字节数为 +result);

  TestCallback runIt();

  

cha138/Article/program/Java/hx/201311/26786

相关参考

知识大全 Delphi 中动态链接库(dll)的建立和使用[2]

Delphi中动态链接库(dll)的建立和使用[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 Delphi 中动态链接库(dll)的建立和使用[1]

Delphi中动态链接库(dll)的建立和使用[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 VB动态调用自己的ActiveX DLL

VB动态调用自己的ActiveXDLL  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &

知识大全 在C#中动态调用native dll的导出函数

在C#中动态调用nativedll的导出函数  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在C

知识大全 Delphi中动态链接库两种调用方式的比较

Delphi中动态链接库两种调用方式的比较  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!一动态链接

知识大全 JNA调用DLL一点小结

JNA调用DLL一点小结  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  &n

知识大全 asp调用C#编写的DLL发送邮件

asp调用C#编写的DLL发送邮件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一直想写一个a

知识大全 C#使用Dllmport来调用dephi的dll

C#使用Dllmport来调用dephi的dll  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&n

知识大全 怎样在MFC中调用C#编写的DLL

怎样在MFC中调用C#编写的DLL  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一使用/clr

知识大全 如何在Delphi中调用.Net编写的DLL中的函数

如何在Delphi中调用.Net编写的DLL中的函数  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!