`
zhaohaolin
  • 浏览: 1011228 次
  • 性别: 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 ();
    }
}

分享到:
评论

相关推荐

    java调用串口文件32位和64位

    Java调用串口文件在开发过程中常常用于与硬件设备进行通信,例如读写串行端口数据。在处理这类需求时,Java社区提供了一个开源库RXTX,它允许Java程序与串行(COM)和并行(LPT)端口进行交互。RXTX库包括两个关键的...

    Jna调用动态库相关jar包

    标题中提到的"Jna调用动态库相关jar包"是指JNA库的两个主要组件:jna-3.5.1.jar和platform-3.5.1.jar。这两个jar文件是JNA框架的一部分,用于在Java程序中实现对本地库的调用。 1. **jna-3.5.1.jar**:这是JNA的...

    webservice动态调用

    Web服务(WebService)是一种基于互联网的、平台独立的交互方式,允许不同的系统之间进行数据...动态调用使得客户端无需关心服务端的具体实现,只需要知道服务的接口描述,这对于大型系统的开发和维护具有重要意义。

    javacv需要导入的包

    这些库在原生的C++环境中被广泛使用,但在Java中使用时往往需要复杂的JNI(Java Native Interface)调用。JavaCV通过提供简洁的Java接口,使得在Java中使用这些库变得更加便捷。 1. **OpenCV**:OpenCV是一个开源的...

    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 如何获取返回的值。

    arm64位系统jdk1.8版opencv动态库opencv-454.jar和libopencv-java454.so

    这个包中的`opencv-454.jar`文件是Java版的OpenCV库,它允许Java开发者直接在Java代码中调用OpenCV的功能,从而无需关心底层的C++实现细节。 其次,`libopencv_java454.so`是一个动态链接库文件,它是OpenCV与Java...

    Java使用 清华文通OCR文件

    这涉及到创建C/C++的桥接代码,编译成动态链接库,然后在Java中通过`System.loadLibrary()`加载。 - 如果是JAR库,直接将其添加到Java项目的类路径中,然后通过Java代码调用相应的类和方法。 2. **API使用**: - ...

    JAVA调用SAP函数指南.pdf

    ### JAVA调用SAP函数指南:深入解析与实践 #### 概览 在现代企业级应用开发中,Java与SAP系统的集成变得日益重要。本文档《JAVA调用SAP函数指南》旨在提供一个全面而深入的理解框架,帮助开发者掌握如何通过Java...

    Java使用传统socket手写的远程RPC框架调用框架

    在RPC框架中,我们需要选择合适的序列化库,将方法调用信息和结果对象转化为字节流,以便在网络中传输。 5. **服务注册与发现**:在大型分布式系统中,服务提供者通常会有多台机器实例。服务注册与发现机制可以帮助...

    Java代码实现调用RapidOCR(基于PaddleOCR),适配Mac、Win、Linux,支持最新PP-OCRv4

    在本项目中,Java代码被用来调用RapidOCR,这是一种基于PaddleOCR的OCR(光学字符识别)工具。RapidOCR是由百度开发的高效、轻量级的OCR引擎,而PaddleOCR则是其底层的深度学习框架。PaddleOCR不仅提供强大的文字...

    ZeroMQ 4.2.5 动态库

    标签中的"ZeroMQ DLL 动态库 编译完成"进一步强调了这是预编译好的DLL文件,已经完成了编译过程,开发者可以直接利用它们,而无需关心编译步骤。 压缩包内的文件名"Win32"和"x64"表明了包含的库分别对应于32位和64...

    java-cef-win64 MP4.zip

    由于这是一个编译好的库,开发者不需要关心编译过程中的依赖问题,只需关注如何在自己的Java代码中正确使用它。 总的来说,Java CEF Win64 MP4.zip为Java开发者提供了一种简单、高效的方式来在他们的64位Windows...

    Java的四大核心技术

    本地方法接口(JNI)允许Java代码调用非Java语言编写的代码,如C或C++编写的本地库。这对于那些需要访问操作系统底层功能或者调用已有C/C++库的应用非常有用。 - **JNI的作用**:通过JNI,开发者可以利用现有C/C++...

    JAVA编程实验:远程方法调用(RMI).doc

    Java编程实验:远程方法调用(RMI...通过这个实验,学生将深入理解Java RMI的工作原理,包括远程对象的创建、注册、调用,以及如何处理网络通信中的序列化和反序列化问题。这为构建更复杂的分布式系统打下坚实的基础。

    java edna jnative rmi 例子

    `JNativeCpp.dll`可能是实现了Java Native Interface (JNI) 的C++动态库,允许Java代码调用C或C++编写的函数,这在处理性能敏感的代码或利用现有库时非常有用。在这里,JNative可能被用来封装对EDNA数据库的操作,...

    GDAL java包

    - GDAL Java包是GDAL库的Java接口,它允许Java开发者直接调用GDAL的C++接口,无需关心底层实现细节。 - 这个包提供了广泛的GIS操作,包括栅格和矢量数据的读写,投影转换,图像处理,以及复杂的地理空间分析。 2....

    libopencv_java3411.so+opencv-3411.jar

    在实际应用中,开发者需要将`libopencv_java3411.so`放在系统的动态链接库搜索路径下,或者在运行时通过`LD_LIBRARY_PATH`环境变量指定其位置。同时,将`opencv-3411.jar`添加到项目的类路径(ClassPath)中,以便...

    java实现windows文件系统操作监控

    在Java中,我们通常需要通过JNI调用C/C++编写的动态链接库(DLL)来设置和处理这些钩子。 2. **JNI(Java Native Interface)**:JNI是Java平台的标准部分,它允许Java代码和其他语言写的代码进行交互。在本项目中...

Global site tag (gtag.js) - Google Analytics