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

利用JNative实现Java调用动态库

阅读更多
由于项目要求,需要用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();
    }
}

分享到:
评论
2 楼 lang8888511 2012-12-05  
package com.util

import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.pointers.Pointer;
import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;

public class ScriptKeyChar {

public static final String dllName="ScriptKey.Dll";
public static final String getKeyInfo="GetKeyInfo";
public static final String scriptKeyLoad="ScriptKeyLoad";

@SuppressWarnings("static-access")
public static void  main(String arg[]) throws IllegalAccessError, NativeException, IllegalAccessException {

//String path =getResource(File.separator).getPath();
//System.out.println(path);
String fileName="E:\\work\\fax\\src\\com\\fax\\util\\mail\\ScriptExec.DAT";
JNative jn = new JNative(dllName, getKeyInfo);
jn.setLoggingEnabled(true);
//MemoryBlock m=MemoryBlockFactory.createMemoryBlock(128);
Pointer pointer= new Pointer(MemoryBlockFactory.createMemoryBlock(128));
jn.setRetVal(Type.INT);
//pointer.createPointer(100);
//pointer.setStringAt(0, fileName);
int i=0;
jn.setParameter(i++, fileName);
jn.setParameter(i++, pointer);
jn.invoke();
        System.out.println(pointer.getAsByte(0));
        System.out.println(pointer.getAsLong(0));
        /*        for (int j = 0; j < result.length; j++) {
  System.out.println(result[j]);
}*/
        System.out.println(jn.getRetValAsInt());
}
}

#函数的定义
extern "C" long PASCAL EXPORT GetKeyInfo(const char *pszFileName,char *pszKeyInfo)
{
CScriptKey Key;
char Buf[128];
}

我如何得到pszKeyInfo的值 
1 楼 hyint 2009-02-18  
刚刚的帖子回复到文件操作的地方了,但是问题还是存在的,继续你的帮助!如果你用过CallBack的话,请给个Java这边实现CallBack的例子,贴出来好吗?或者发一份给我:hyint@163.com

相关推荐

    利用JNative实现Java调用动态库.pdf

    利用JNative实现Java调用动态库.pdf

    JNative用java调用动态库VC++

    在这个场景中,我们关注的是JNative,一个简化Java调用C/C++库的开源库。 JNative 的优点在于它的易用性、数据类型处理的高效以及对回调函数的支持。在使用JNative之前,我们需要了解一些基本概念。例如,`...

    JNative Java调用动态链接库jar包

    然而,需要注意的是,虽然JNative简化了Java调用本地代码的过程,但它仍然有一些限制和潜在问题: - **兼容性**:JNative可能不支持所有版本的Java和操作系统,使用前需确认兼容性。 - **安全性**:直接调用本地...

    jnative框架调用dll动态库-简单demo(带dll文件).zip

    本篇文章将详细介绍如何使用jnative框架在Java中调用DLL动态库,并提供一个简单的示例。 首先,理解jnative框架的核心概念。jnative是一个纯Java库,它提供了一种简单的方式来调用C和C++的函数,无需编写JNI头文件...

    Jnative1.4_java调用动态库所需jar

    `Jnative1.4`是一个库,它提供了在Java中调用动态库的功能。 JNI是Java平台标准的一部分,允许Java代码和其他语言写的代码进行交互。它为Java开发者提供了一种方式来编写本地方法,这些方法可以直接访问和操作硬件...

    Java调用动态库.pdf

    Java 调用动态库是 Java 语言中的一种技术,用于调用动态链接库(DLL),从而实现与native 代码的交互。下面将详细介绍 Java 调用动态库的知识点。 一、使用 JNI 调用动态库 JNI(Java Native Interface)是一种...

    jnative调用动态库

    标题中的“jnative调用动态库”指的是Java中使用JNative库来调用本地(操作系统级别的)动态链接库(DLL或SO文件)的技术。在Java中,为了与操作系统底层功能进行交互,比如调用C/C++编译的库,我们可以使用Java ...

    java调用动态库实例

    总结,Java调用动态库实例展示了如何利用JNA和JNative在Java中调用本地函数,既适用于独立的Java应用,也适用于Web项目。JNA提供了更简洁的接口,而JNative则提供了对本地代码的直接访问。理解并掌握这两种技术,将...

    java 调用动态库

    本篇文章将详细介绍如何在Java中调用动态库,主要涉及两种方法:JNative和JNI(Java Native Interface)。 首先,让我们了解JNative。JNative是一个开源库,它为Java提供了方便的接口来调用C和C++的动态库。通过...

    java调用动态库(Jnative).zip

    本压缩包文件“java调用动态库(Jnative).zip”很可能包含了一系列示例、教程和相关资源,帮助开发者学习如何在Java程序中使用JNI来调用动态库。 JNI全称为Java Native Interface,它定义了一组接口和数据类型,使得...

    JAVA调用动态链接库DLL之JNative学习源码

    `JNative` 是一个用于Java调用本地代码(如DLL)的开源库,它提供了一个方便的接口,使得Java程序员可以轻松地与动态链接库进行交互。本教程将围绕如何使用`JNative`来调用DLL进行深入讲解。 首先,我们要理解Java...

    Java调用Win32获取窗口句柄JNative-1.3.2

    JNative库则是对JNI的封装,它简化了Java调用本地代码的过程。在这个特定的场景中,JNative提供了一个API,让Java程序可以调用Win32 API函数`FindWindow`,该函数用于获取指定类名和窗口标题的窗口的句柄。窗口句柄...

    jnative,调用动态链接库

    这些方法会调用动态链接库中的功能。 3. **编译本地代码**:将C/C++源代码编译成动态链接库(在Windows上是.dll文件,在Unix/Linux上是.so文件)。 4. **加载库并注册本地方法**:在Java代码中,使用`System....

    JAVA调用动态库必备jar包

    "JAVA调用动态库必备jar包"就是针对这个需求提供的资源。 JNI库主要包含两部分:Java部分和本地部分。Java部分是Java代码,用于声明native方法,这些方法将在本地代码中实现。本地部分则是在C或C++中编写的代码,...

    在Java程序中使用JNative调用dll文件

    在Java程序中调用DLL(动态链接库)文件通常是通过JNI(Java Native Interface)来实现的,而JNative是JNI的一个封装库,它提供了一种更简洁的方式来调用C/C++编写的本地代码。这篇博客文章可能介绍了如何利用...

    Java调用动态库[收集].pdf

    在Java中调用动态库,通常有两种主要的方法:一...总结,Java调用动态库可以根据项目需求选择JNI或JNative。对于需要高性能、低级控制的情况,JNI是首选;而对于快速集成、简单调用的需求,JNative提供了更便捷的途径。

    重难点之Java调用动态库.pdf

    Java调用动态库是开发过程中常见的一种需求,尤其是在需要与底层C或C++代码交互时。本文主要讨论两种方法:JNI(Java Native Interface)和JNative.jar。 首先,使用JNI调用动态库需要遵循以下步骤: 1. **创建C/...

    JNA.jar-JNative.jar-dll创建-JAVA调用-VC调用

    标题中的“JNA.jar-JNative.jar-dll创建-JAVA调用-VC调用”涉及到的是Java平台下通过JNI(Java Native Interface)的两种实现方式,JNA(Java Native Access)和JNative,来与C/C++编写的动态链接库(DLL)进行交互...

    java利用jnative调用DLL.txt

    JNative是一个强大的Java库,允许Java应用程序直接调用本地动态链接库(DLL)或共享库。它为开发者提供了一个简单而灵活的方式来集成本地代码与Java环境,尤其适用于那些需要高性能计算或者与操作系统紧密集成的应用...

    java调用DLL:JNative

    ### Java调用DLL:JNative概述 在Java项目中,有时候需要调用本地系统的动态链接库(DLL)来实现特定的功能。传统的做法是通过Java Native Interface (JNI)来进行调用,但这往往涉及到复杂的配置和繁琐的过程。为了...

Global site tag (gtag.js) - Google Analytics