• 一个简单的jnative调用dll例子,因为网上找到java的都不包含dll代码,所以自己研究弄了个简单例子
  • 1,首先下载JNative的库,其中包含JNative.jar, JNativeCpp.dll, libJNativeCpp.so这三个包。  JNative.jar是需要导入到Java工程的lib下。 通过Build Path即可导入。 建议将JNative.jar放在jdk的jre\lib\ext文件...

    1,首先下载JNative的库,其中包含JNative.jar, JNativeCpp.dll, libJNativeCpp.so这三个包。

          JNative.jar是需要导入到Java工程的lib下。 通过Build Path即可导入。 建议将JNative.jar放在jdk的jre\lib\ext文件里。

          JNativeCpp.dll是必须放入到jdk的jre\bin文件里,否则就会报JNative找不到的错误。

           libJNativeCpp.so是Linux操作系统的,由于没有做过实验,所以暂时不予说明。

    2,由于  JNativeCpp.dll是32为windows程序,所以需要下载jdk 32位的版本才可以。(本人就是在这个上面浪费了一天的时间在调试错误。)

    3,将需要调用的dll动态链接库放置到system32文件里,否则就会出现找不到dll文件的错误。

    4,在调用dll后需要通过JNative的setParameter()方法来给dll库中所需要调用的函数传参,由于方法的限制,在给dll函数中传char[]是不成功的,因为setParameter()是不支持char[]类型的。而且在传byte[]等这些参数的时候,需要将setParameter()第二个参数写为Type.VOID。

    5,下面是代码部分

    //导入JNative库

    import org.xvolks.jnative.JNative;
    import org.xvolks.jnative.Type;

    //调用dll库
    JNative getUrl=null;

    byte[] f1=null;    //dll方法需要传的参数
    byte[] f2=null;

    f1=f3.getBytes();   //f3 f4 为String
    f2=f4.getBytes();

    getUrl = new JNative("ARTH_DLL", "Match2Fp");    //调用dll库,第一个参数为dll名字  第二个参数为dll库中函数的名字

    try {
    getUrl.setRetVal(Type.INT);                            //定义函数返回值类型
    } catch (IllegalAccessException e) {
    e.printStackTrace();

    try {
    getUrl.setParameter(0, Type.VOID, f1);        //传递参数,第一个参数为所调用的函数中的第几个参数。   第二个参数为向多调用的函数中的传参类型    第三个参数为传递的值
    getUrl.setParameter(1, Type.VOID, f2);
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    }
    getUrl.invoke();                                                 //执行所调用的函数
    try {
    i=getUrl.getRetValAsInt();                                    //获取所调用的函数的返回值
    System.out.print(String.valueOf(i));
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    }

    展开全文
  • 使用JNative调用dll方法, dll 文件名为 : IMLib.dll、MTLib.dll、MT_PlaneLib.dll、InfraredSDK.dll。   这些dll之间有相互依赖关系。   这些dll文件都是自己写的C++代码生成的,由于涉及到商业,故在此不...

     

    使用JNative调用dll方法,

    dll 文件名为 : IMLib.dll、MTLib.dll、MT_PlaneLib.dll、InfraredSDK.dll。

     

    这些dll之间有相互依赖关系。

     

    这些dll文件都是自己写的C++代码生成的,由于涉及到商业,故在此不提供。

     

    使用到的 jar 包是 : JNative.jar  见附件

     

    1. C++接口及其描述

    HANDLE IFR_API IFR_LoadFile(HWND WndWindow, char *cFileName, int iFileType, int *nBeginTime, int *nEndTime);
    函数说明:装载录像文件。此函数会自动调用 IFR_Init函数
    输入参数:	
    WndWindow:图像播放设备的句柄,也是消息接收句柄,如果不需要通过SDK来显示图像只要传递NULL就可以。
    cFileName:要加载的文件名及路径
    iFileType:要加载的文件类型(0为DLI,1为DLV文件,2为JPG)
    nBeginTime:文件起始时间
    nEndTime:文件结束时间
    返回值:> 0 加载文件后的操作句柄,同IFR_Init 返回的句柄。
    	<= 0 加载失败

     

    2.  在java中使用junit方法测试(junit4)

     

    TestDll.java

    import org.junit.Before;
    import org.junit.Test;
    import org.xvolks.jnative.JNative;
    import org.xvolks.jnative.Type;
    import org.xvolks.jnative.exceptions.NativeException;
    
    public class TestDll {
    
    	@Before
    	public void setUp() throws Exception {
    
    		try {
    
    			String userDir = System.getProperty("user.dir")
    					+ "\\src-resources\\dll\\";
    			System.load(userDir.concat("IMLib.dll"));
    			System.load(userDir.concat("MTLib.dll"));
    			System.load(userDir.concat("MT_PlaneLib.dll"));
    			System.load(userDir.concat("InfraredSDK.dll"));
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    	/**
    	 * @Title: test
    	 * @deprecated: 使用JNative调用dll方法
    	 * @author 
    	 * @date 2014-3-3
    	 */
    	@Test
    	public void loadFile() {
    		try {
    			String userDir = System.getProperty("user.dir");
    			// 红外图像路径
    			String imagePath = userDir+"\\src-resources\\images\\M113236.DLI";
    			// 要加载的文件类型(0为DLI,1为DLV文件,2为JPG)
    			Integer fileType = new Integer(0);
    			// 参数说明:InfraredSDK为dll名, IFR_LoadFile为要调用的函数名
    			JNative jn = new JNative("InfraredSDK", "IFR_LoadFile");
    			// 设置此函数的返回值
    			jn.setRetVal(Type.INT);
    
    			//
    			// jn.setParameter(0, Type.STRING, "");
    			jn.setParameter(1, Type.STRING, imagePath);
    			jn.setParameter(2, Type.INT, fileType.toString());
    			// jn.setParameter(3, Type.STRING, "");
    			// jn.setParameter(4, Type.STRING, "");
    
    			// 执行
    			jn.invoke();
    
    			// 返回值
    			int retVal = Integer.parseInt(jn.getRetVal());
    
    			// 打印函数返回值
    			System.out.println(retVal);
    
    			if (retVal > 0) {
    				System.out.println("加载红外图像成功");
    			} else {
    				System.out.println("加载红外图像失败");
    			}
    
    		} catch (NativeException e) {
    			e.printStackTrace();
    		} catch (IllegalAccessException e) {
    			e.printStackTrace();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    }

     

    3. 返回结果

    1230045256
    加载红外图像成功

     

    展开全文
  • JNative调用DLL

    2020-03-14 23:33:46
    NULL 博文链接:https://stevenjohn.iteye.com/blog/867649
  • 代码下载链接:... 1.下载jnative。jar 及JNativeCpp.dll 2.将使用的dll文件及JNativeCpp.dll拷贝至系统system32下 开发dll 1.新建工程   2.开发 3.生成dll  

    代码下载链接:http://download.csdn.net/detail/study_zy/9872411


    1.下载jnative。jar 及JNativeCpp.dll

    2.将使用的dll文件及JNativeCpp.dll拷贝至系统system32下

    开发dll
    1.新建工程
     
    2.开发

    3.生成dll
     


    java
     

    注意:因为开发的时候,可能导致dll的函数名与你代码中的不一致,可以用depends工具查看dll,确定函数名
     
     


     

    展开全文
  • 因为项目需要,用到了java调用dll文件中的方法。写成dll文件大多是用C、VB、Delphi语言弄成的,对于我这个纯粹干java的人员来说,着实让我太为难了。唉,也就是说我编程底子没有搭好,惭愧。要是这些语言我都会些,...

    下文参考自:http://blog.163.com/wex660@126/blog/static/2415306520103142363964/

    因为项目需要,用到了java调用dll文件中的方法。写成dll文件大多是用C、VB、Delphi语言弄成的,对于我这个纯粹干java的人员来说,着实让我太为难了。唉,也就是说我编程底子没有搭好,惭愧。要是这些语言我都会些,也不至少让我了解并应用这个技术花了很长时间。
    我是用JNative技术做的一个例子。需要用到的是:JNative.jar,JNative.dll这些是在Windows中开发的,如果用Linus要用到libJNative.so
    1.将JNative.dl,所要读的dll文件l放在C:\windows\system32下面。
    2.将JNative.jar放在你的项目下的lib下面
    3.将要读的dll文件放在跟使用的类相同的目录下。
    4.我的类的源码 .MemoryBlockFactory;

    public class SystemTime extends AbstractBasicData<SystemTime>{
    
        public short wYear;
        public short wMonth;
        public short wDayOfWeek;
        public short wDay;
        public short wHour;
        public short wMinute;
        public short wSecond;
        public short wMilliseconds;
    
        /**
         * 分配内存,并返回指针
         */
        public Pointer createPointer() throws NativeException {
            pointer = new Pointer(MemoryBlockFactory.createMemoryBlock(getSizeOf()));
            return pointer;
        }
    
        /**
         * 内存大小
         */
        public int getSizeOf(){
            return 8 * 2;
        }
    
        /**
         * 获取通过内存指针解析出结果
         */
        public SystemTime getValueFromPointer() throws NativeException {
            wYear = getNextShort();
            wMonth = getNextShort();
            wDayOfWeek = getNextShort();
            wDay = getNextShort();
            wHour = getNextShort();
            wMinute = getNextShort();
            wSecond = getNextShort();
            wMilliseconds = getNextShort();
            return this;
        }
    
        public SystemTime() throws NativeException{
            super(null);
            createPointer();
        }
    
        public String toString(){
            return wYear + "/" + wMonth + "/" + wDay + " at + " + wHour + ":" + wMinute + ":" + wSecond + ":" + wMilliseconds;
        }
    
        public static SystemTime GetSystemTime() throws NativeException, IllegalAccessException {
            // 创建对象
            JNative nGetSystemTime = new JNative("Kernel32.dll", "GetSystemTime");
            SystemTime systemTime = new SystemTime();
            // 设置参数
            nGetSystemTime.setParameter(0, systemTime.getPointer());
            nGetSystemTime.invoke();
            // 解析结构指针内容
            return systemTime.getValueFromPointer();
        }
    
        public static void main(String[] args) throws NativeException, IllegalAccessException{
            System.err.println(GetSystemTime());
        }
    
    }

    注:Kernel32.dll是我要读的dll文件,GetSystemTime是dll文件中的方法(就是所谓的函数名)

    That's ok,相信我这么不懂dll的都能做出来,你也能

    ===============================另一个参考====================================

    下文参考自:http://blog.csdn.net/volant_hoo/article/details/2102726

    因为项目需求,需要在java中调用dll文件。测试过几种方法,发现还是JNative最为便利。

    1.   安装

    jnative.sourceforge.net下载最新的JNative二进制包,解压后得到3个文件:JNativeCpp.dll,libJNativeCpp.so,JNative.jar,其中:

    JNativeCpp.dll     放在windows/system32目录下

    libJNativeCpp.so    linux下使用

    JNative.jar          导入工程中

    2.   使用

    2.1.     加载dll文件

    JNative可使用两种方式加载dll文件:

    使用System.loadLibrary加载

    使用此方法可加载系统目录中的dll文件。可以先把dll文件复制到system32目录下,使用文件前缀名作为参数来加载dll文件。

    使用System.load加载

    此方法参数为dll文件全路径名。

    2.2.     调用函数

    1、首先创建JNative对象:

    JNative jnative = new JNative(dll文件名, 函数名);

    2、设置返回值类型:

    jnative.setRetVal(Type.INT);

    3、设置参数

    jnative.setParameter(0, Type.STRING, …); //设置第一个参数为字符串

    jnative.setParameter(1, Type.INT, String.valueof(…));       //设置第二个参数为整数

    4、执行

    n.invoke();

    5、获取返回值

    Integer.parseInt(jnative.getRetVal());

    2.3.     一个实例

    来自国外网上的一个实例,用于摸索struct处理方法:

    import org.xvolks.jnative.JNative;
    import org.xvolks.jnative.exceptions.NativeException;
    import org.xvolks.jnative.misc.basicStructures.AbstractBasicData;
    import org.xvolks.jnative.pointers.Pointer;
    import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;
    
    
    /**
     * SystemTime
     * 
     * typedef struct _SYSTEMTIME {
     *     WORD wYear;
     *     WORD wMonth;
     *     WORD wDayOfWeek;
     *     WORD wDay;
     *     WORD wHour;
     *     WORD wMinute;
     *     WORD wSecond;
     *     WORD wMilliseconds;
     * } SYSTEMTIME, 
     */
    public class SystemTime extends AbstractBasicData<SystemTime> {
    
        public short wYear;
        public short wMonth;
        public short wDayOfWeek;
        public short wDay;
        public short wHour;
        public short wMinute;
        public short wSecond;
        public short wMilliseconds;
    
        /**
         * 分配内存,并返回指针
         */
        public Pointer createPointer() throws NativeException {
            pointer = new Pointer(MemoryBlockFactory.createMemoryBlock(getSizeOf()));
            return pointer;
        }
    
        /**
         * 内存大小
         */
        public int getSizeOf() {
            return 8 * 2;
        }
    
        /**
         * 获取通过内存指针解析出结果
         */
        public SystemTime getValueFromPointer() throws NativeException {
            wYear = getNextShort();
            wMonth = getNextShort();
            wDayOfWeek = getNextShort();
            wDay = getNextShort();
            wHour = getNextShort();
            wMinute = getNextShort();
            wSecond = getNextShort();
            wMilliseconds = getNextShort();
            return this;
        }
    
        public SystemTime() throws NativeException {
            super(null);
            createPointer();
        }
    
        public String toString() {
            return wYear + "/" + wMonth + "/" + wDay + " at + " + wHour + ":" + wMinute + ":" + wSecond
                    + ":" + wMilliseconds;
        }
    
        public static SystemTime GetSystemTime() throws NativeException, IllegalAccessException {
            // 创建对象
            JNative nGetSystemTime = new JNative("Kernel32.dll", "GetSystemTime");
            SystemTime systemTime = new SystemTime();
            // 设置参数
            nGetSystemTime.setParameter(0, systemTime.getPointer());
            nGetSystemTime.invoke();
            // 解析结构指针内容
            return systemTime.getValueFromPointer();
        }
    
        public static void main(String[] args) throws NativeException, IllegalAccessException {
            System.err.println(GetSystemTime());
        }
    
    }

     

    展开全文
  • JNATIVE 调用dll方法

    2011-09-23 10:07:16
    JNATIVE能很方面的调用dll中的方法: C语言代码:[code="java"]#include "stdafx.h" #include #include #include #include #include typedef int (*bOpenUsb20Video)(); ...
    JNATIVE能很方面的调用dll中的方法:
    C语言代码:
    #include "stdafx.h"
    #include <Windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string>
    #include <string.h>


    typedef int (*bOpenUsb20Video)();
    typedef int (*sGetBarData)(char *out);
    typedef int (*bCloseUsb20)();

    int main(int argc, char* argv[])
    {

    HINSTANCE hDll; //DLL句柄
    bOpenUsb20Video DllbOpenUsb20Video;
    sGetBarData DllsGetBarData;
    bCloseUsb20 DllbCloseUsb20;

    hDll = LoadLibrary("dllLpDecode.dll");
    if (hDll != NULL)
    {
    DllbOpenUsb20Video = (bOpenUsb20Video)GetProcAddress(hDll,"bOpenUsb20Video");
    if(DllbOpenUsb20Video==NULL)
    return 0;

    DllsGetBarData = (sGetBarData)GetProcAddress(hDll,"sGetBarData");
    if(DllsGetBarData==NULL)
    return 0;

    DllbCloseUsb20 = (bCloseUsb20)GetProcAddress(hDll,"bCloseUsb20");
    if(DllbCloseUsb20==NULL)
    return 0;

    }


    if (0 != DllbOpenUsb20Video ())
    return 0;

    int ret;
    char out[256];
    int count=10;
    while (count)
    {
    ret = DllsGetBarData (out);
    if (ret == 1)
    {
    printf ("result:%s\r\n",out);
    count --;
    }

    Sleep (100);
    }

    DllbCloseUsb20 ();

    FreeLibrary(hDll);


    return 0;

    }


    使用jnative改写的方法:
    /*
    * To change this template, choose Tools | Templates
    * and open the template in the editor.
    */
    package com.tfsm.movie.camera;

    import java.util.logging.Level;
    import java.util.logging.Logger;
    import org.xvolks.jnative.JNative;
    import org.xvolks.jnative.Type;
    import org.xvolks.jnative.pointers.Pointer;
    import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;

    /**
    *
    * @author Administrator
    */
    public class HY100CameraDecoder {

    static {
    //加载HY100驱动
    System.loadLibrary("lib/dllLpDecode");
    }

    public boolean openCamera() {
    try {
    JNative openCamera = new JNative("lib/dllLpDecode", "bOpenUsb20Video");
    openCamera.setRetVal(Type.INT);
    openCamera.invoke();
    return openCamera.getRetValAsInt() == 0;
    } catch (Exception ex) {
    Logger.getLogger(HY100CameraDecoder.class.getName()).log(Level.SEVERE, null, ex);
    return false;
    }
    }

    public CameraDecodeResult getDecodeData() {
    try {
    JNative decodeData = new JNative("lib/dllLpDecode", "sGetBarData");
    Pointer p = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * 256));
    decodeData.setParameter(0, p);
    decodeData.setRetVal(Type.INT);
    decodeData.invoke();
    int resultCode = decodeData.getRetValAsInt();
    CameraDecodeResult reuslt = new CameraDecodeResult();
    //为1代表成功
    if (resultCode == 1) {
    String result = new String(p.getAsString().getBytes(), "UTF-8");
    return reuslt.setSuccess(true).setResult(result);
    }else{
    return reuslt;
    }
    } catch (Exception ex) {
    Logger.getLogger(HY100CameraDecoder.class.getName()).log(Level.SEVERE, null, ex);
    return new CameraDecodeResult();
    }
    }

    public void closeCamera() {
    try {
    JNative closeCamera = new JNative("lib/dllLpDecode", "bCloseUsb20");
    closeCamera.setRetVal(Type.INT);
    closeCamera.invoke();
    } catch (Exception ex) {
    Logger.getLogger(HY100CameraDecoder.class.getName()).log(Level.SEVERE, null, ex);
    }
    }
    }
    展开全文
  • JNative方法调用dll

    2014-11-14 08:32:28
    at org.xvolks.jnative.JNative.invoke(JNative.java:807) at onlyfun.dllcall.UserCall.main(UserCall.java:101) Dynamic libraries: 0x00400000 - 0x00407000 D:\JDK1.4\bin\javaw.exe 0x77A50000 - 0x77...
  • JAVA调用动态链接库DLL的方法有:JNI(Java Native Interface),JInvoke,JNative(Java to native interface),JNI是JAVA自身提供的方法;JInvoke从何而来不得而知,好像还需要注册付费的,64位的JDK、JIR环境下...
  • 1.要有jnative.jar包 2.JNativeCpp.dll 文件放入到system32目录和本地工程目录下; 3.test.dll文件放入system32目录和本地工程目录下; 注:tomcat发布项目要将*.dll文件放入到tomcat的bin目录下。 一些...
  • java调用dll动态库是有几种方式的,我这里选择的是jnative,下面附上代码。 注意点:jdk选择的是32位1.7版本,tomcat容器选择的是32位7版本 然后接口写完,在不同的机器上部署都出现不同的报错情况...
  • JNative:JAVA调用DLL

    2016-06-24 09:54:12
    (1)选择Java调用C++的工具  通过比较和测试JNI、JNA、BridJ、SWIG和JNative,考虑易用性和功能性,选择了JNative (  a.下载jnative.jar 及JNativeCpp.dll ;  b.将使用的dll文件及JNativeCpp.dll拷贝至系统...
  • JAVA调用动态链接库DLLJNative学习源码,详细请参考:http://blog.csdn.net/testcs_dn/article/details/26980027
  • NULL 博文链接:https://unifocus.iteye.com/blog/678463
  • jnative 调用dll

    2017-12-19 09:56:26
    本来是想用java来做个扒网站的对接,这个网站登录要验证码,用我们的验证码识别库就得调dll, 一百度java是可以调dll,我选择用jnative包来实现,兴冲冲的学着把环境搭好,把dll准备好,代码 写好 JNative ...
  • 环境: jdk1.7_32位 window server 2012 tomcat7.0安装版概况:在项目开发中,使用java的JNative调用window下的dll文件,在项目上线的初期试点,业务量不大的时候一切正常,但是随着使用的用户量变大,tomcat的...
  • 现在我有一个 dll 文件,但是需要调用的方法是在一个类中,请问该如何调用到这个方法呢? 要调用的方法不是静态的,应该需要new对象才能调到,问题就出现在这里了,求各位大神解答! ![图片说明]...
  • 使用JNative调用DLL

    2011-10-11 15:27:53
    ref: TermTx.dll接口调用说明书 1. 将目标DLL库文件及其依赖的DLL文件复制到:%JAVA_HOME%\bin目录下 2. 下载JNative.zip并解压,获得三个文件,分别是:JNativeCpp.dll,libJNativeCpp.so,JNative.jar。 3. ...
  • JNative调用dll打印

    2013-12-19 11:11:59
    最近项目需要调用触摸屏上的打印机,硬件提供方只提供了调用打印机的dll文件,需要项目组自己用java开发调用dll代码。在网上看了些资料,很多介绍JNI或JNA文档都写的不清楚或写的很复杂,决定自己顺便整理下,以作...
1 2 3 4 5 ... 20
收藏数 524
精华内容 209