• 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...
  • 使用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:JAVA调用DLL

    2016-06-24 09:54:12
    为了在Java开发环境中使用DCMTK,做了一下工作: (1)选择Java调用C++的工具  通过比较和测试JNI、JNA、BridJ、SWIG和JNative,考虑易用性和功能性,选择了JNative (  a.下载jnative.jar 及JNativeCpp.dll ; ...

    为了在Java开发环境中使用DCMTK,做了以下工作:

    (1)选择Java调用C++的工具 

    通过比较和测试JNIJNABridJSWIGJNative,考虑易用性和功能性,选择了JNative

                   a.下载jnative.jar 及JNativeCpp.dll ;

          b. jnative.jar 加载到当前工程下;

      c.将使用的dll文件及JNativeCpp.dll拷贝至系统system32下或项目根目录,一定要通过dll查看器将涉及到所有dll文件都拷贝到根目录下 。

    (2)编译动态库dll  

    为了在Java环境中可以调用C++库,需要生成其的动态链接库,Qt封装的DCMTK的动态库已编译好。

    (3)Java调用DCMTK  

    现在进入通过JNativeJava调用DCMTK阶段。JNative无法对调用Qt的导出类,只能调用导出函数,现在正在进行函数封装,对封装后的函数进行调用可以实现DICOM的解析。

    现在已经成功实现Java调用DCMTKDLL,完成DICOM信息tag的解析,附上运行结果和代码:

    运行结果:

    代码:
    //20160520 将获取tag的函数封装好了 【dcx】
     public String getTag(int pFile,String tag) throws NativeException, IllegalAccessException {
    	 JNative vTag = null;
    	 try { 
    		 vTag =new JNative("SpiderDicomFileD", "ParseTag");
    		 int i = 0;
    		 vTag.setRetVal(Type.STRING);
    		 vTag.setParameter(i++, pFile);
    		 //String tag="0018,1110" 
    		 //substring(0,m)截取[0,m)之间的子字符串   substring(m)截取[m,end]之间的子字符串
    		 String getFirst = tag.substring(0,4);
    		 String getSecond = tag.substring(5);
    		 //String getSecond = tag.substring(tag.indexOf(",") + 1);
    		 //十六进制转十进制 Integer.parseInt("0018",16) 给tag传入代号
    		 vTag.setParameter(i++, Integer.parseInt(getFirst,16));
    		 vTag.setParameter(i++, Integer.parseInt(getSecond,16));
    		 vTag.invoke();
    		 return vTag.getRetVal();
    		 } 
    	 finally{ 
    		 if (vTag !=null){ 
    			 vTag.dispose(); 
    			 }
    	 } 
    }


    展开全文
  • 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();
    }

    展开全文
  • 最近学习了一下win7系统下java调用C语言写的代码,做个总结。 1、我的电脑是win7 64位系统,安装的jdk也是64位,后来始终提示 运行的时候总是报错 JNative library not loaded, sorry ! JNative library not ...

    最近学习了一下win7系统下java调用C语言写的代码,做个总结。
    java调用C语言的DLL文件有多种方法
    1)JNA—java native方法
    2)JNI—java native interface
    3)jnative.jar 包
    详细参考:
    http://blog.csdn.net/ranmudaofa/article/details/9798779

    1、我的电脑是win7 64位系统,安装的jdk也是64位,后来始终提示
    运行的时候总是报错
    JNative library not loaded, sorry !
    JNative library not loaded, sorry !
    JNative library not loaded, sorry !
    JNative library not loaded, sorry !

    试了各种方法,把
    JNativeCpp.dll 放到 C:\Windows\System32
    、jdk/bin 目录都特么不行,一直报错,
    简直要崩溃了,后来找到一篇文章:
    http://blog.csdn.net/longtingjing/article/details/44541649
    把64位jdk换成32位jdk 成功了!!!!我擦,真坑啊

    2、网上说java调用的C语言文件需要下载
    Visual Studio 2010 ,谁特么有功夫下载这么大的编辑器。。。
    于是搜索了一些文章,推荐使用MINGW c/c++ 编译工具。
    https://sourceforge.net/projects/mingw/
    这里写图片描述

    这个是免安装版,下载完之后把路径配置到环境变量里面,我的如下:
    Path
    C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\RSA SecurID Token Common;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Users\LocalUser\Desktop\adt-bundle-windows-x86-20140702\adt-bundle-windows-x86-20140702\sdk\platform-tools;%JAVA_HOME%\bin;%java_home%\jre\bin;%adb%;C:\Users\lihui20\Downloads\mingw\bin;

    注意C:\Users\lihui20\Downloads\mingw\bin;
    添加之后可以
    使用cmd,在任何路径选使用
    强大的 gcc命令。

    3、下载JNative 压缩包。
    http://sourceforge.NET/projects/jnative/
    最好下载所以文件(3个)
    这里写图片描述

    Jnative.jar 这个是必须要的,java代码里面会用到。
    jnativecpp.dll 后来发现我这个没有其实也可以。网友说最新的Jnative.jar 里面已经包含后jnativecpp.dll 这个文件。经过验证发现确实如此:
    这里写图片描述
    lib-bin存在这个文件。不需要再添加了

    libjnativecpp.so 这个是linux下使用,也就是android 手机开发app使用的。

    3、写c文件。我的例子,一个菜鸟,写的比较简单,java输入一个数组,C语言打印。
    array.h :头文件

        #ifndef MINGW_DLL_H__  
        #define MINGW_DLL_H__  
        void add(int a[5]);  
        #endif  

    保存。

    再写array.c

    #include <stdio.h>  
    #include "array.h"  
     void add(int a[5]){  
      //1.for循环遍历  
      int i=0;
        for (i = 0; i <5; i++)  
        {  
            printf("a[%d] = %d\n",i ,a[i]);  
        } 
    
    } 

    保存
    4、使用gcc命令生成 .dll 动态库文件,给java调用
    C:>gcc -Wall -shared array.c -o array.dll
    注意:上面的array.c array.h文件在一个目录下,我的是在
    C:\ 下面。
    自动生成array.dll文件。

    5、把array.dll放到当前项目的最外层目录下(不放在这也可以,使用绝对路径)。
    我的是:E:\ecplicespace\FileExplorer-master\testjni\
    如果array.dll文件放的路径不对,会提示:
    test
    Exception in thread “main” org.xvolks.jnative.exceptions.NativeException: DLL d:\array.dll not found
    at org.xvolks.jnative.JNative.nLoadLibrary(Native Method)
    at org.xvolks.jnative.JNative.loadLibrary(JNative.java:545)
    at org.xvolks.jnative.JNative.(JNative.java:521)
    at org.xvolks.jnative.JNative.(JNative.java:440)
    at com.study.jnilearn.Test.testJNative(Test.java:14)
    at com.study.jnilearn.Test.main(Test.java:50)

    java代码:

    package com.study.jnilearn;
    
    import org.xvolks.jnative.JNative;
    import org.xvolks.jnative.exceptions.NativeException;
    import org.xvolks.jnative.pointers.Pointer;
    import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;
    
    public class Test {
        public static int testJNative(int a[]) throws NativeException,
                IllegalAccessException {
    
            JNative n = null;
            try {
            //这里可以使用绝对路径 
                n = new JNative("c:\\array.dll", "add");
                // n.setRetVal(Type.VOID);
                // // n.setParameter(0, a);
                // // n.setParameter(1, b);
                // n.set
                // n.invoke();
                // System.out.println("返回:" + n.getRetVal());
                // 为数组创建空间
                Pointer aArrIntInput = new Pointer(
                        MemoryBlockFactory.createMemoryBlock(4 * a.length));
    
                // 初始化数组
                for (int i = 0; i < a.length; i++) {
                    aArrIntInput.setIntAt(4 * i, a[i]);
                }
    
                // 设定传入参数
                n.setParameter(0, aArrIntInput); // 数组指针
                // n.setParameter(1, a.length); // 数组大小
    
                // 设定返回类型
                // n.setRetVal(Type.VOID);
    
                // 调用DLL
                n.invoke();
                // return Integer.parseInt(n.getRetVal());
            } finally {
                if (n != null)
                    n.dispose();
            }
            return 0;
        }
    
        public static void main(String[] args) throws NativeException,
                IllegalAccessException {
            System.out.println("test");
            testJNative(new int[] { 1, 2, 3, 4, 9 });
    
            // System.loadLibrary("array");
            // Value v=new Value();
            // int a[]={1,2,3,4};
            // int b[]={6,7,8,9};
            // v.add(a);
        }
    }
    

    结果:
    test
    a[0] = 1
    a[1] = 2
    a[2] = 3
    a[3] = 4
    a[4] = 9

    这里,win7下 java 使用jnative 包调用 c 的简单demo完成了,
    当然更复杂的功能编写实现,还需要我们继续学习。

    展开全文
  • JNative是一种能够使Java语言使调用DLL的一种技术,对JNI进行了封装,可能有些读者会有这样一个问题,JNative对JNI进行了封装,并且是一种跨语言的使用DLL,会不会在效率方面很不如人意,我可以用我使用Jnative的经验...

    JNative是一种能够使Java语言使调用DLL的一种技术,对JNI进行了封装,可能有些读者会有这样一个问题,JNative对JNI进行了封装,并且是一种跨语言的使用DLL,会不会在效率方面很不如人意,我可以用我使用Jnative的经验告诉你,不会!因为我用Jnative就是用来处理大量的数据调用,是基于实时数据库接口的调用。而实时数据库的数据量是非常大的。

          废话少说,让我们一步一步进入Jnative的世界吧。

          首先需要下载一个java的第三方包Jnative.jar,因为jnative是开源的,而可以下载其源码。下载地址如下:

         

            下载地址:

    JNative_1.4RC2_src.zip : http://jaist.dl.sourceforge.net/sourceforge/jnative/JNative_1.4RC2_src.zip

    JNative.jar : http://nchc.dl.sourceforge.net/sourceforge/jnative/JNative.jar

    如果以上版本不能完成下载,说明版本有可能更新,请从以下地址中下载:

    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/

     

    JNative_1.4RC2_src.zip是JNative源代码的压缩包把它解压后从中找到libJNativeCpp.so和JNativeCpp.dll两个文件.JNativeCpp.dll应用在Windows平台下.把它放在c:\windows\system32目录下.libJNativeCpp.so应用在Linux平台下.把JNative.jar加入到所需的工程中.把要调用的dll文件也放在c:\windows\system32目录下

     以上蓝色部分引用的文章地址为:http://hi.baidu.com/wtltsdwqt/blog/item/144bb512df469ec9c2fd7878.html

     

    在这里我要补充的是:也可以把这些DLL放在某个特定的目录下,然后配置环境变量,把这个目录放入系统的path中。这样便于编程时的调试,不用每次都拷贝最新的DLL放入c:\windows\system32中。

     

    基本的环境就是这样配置了,下一篇文章我们将进入《JNative的使用深入解析——基本编程》,讲解基本的jnative的使用。

     

    展开全文
  • 因为项目需要,用到了java调用dll文件中的方法。写成dll文件大多是用C、VB、Delphi语言弄成的,对于我这个纯粹干java的人员来说,着实让我太为难了。唉,也就是说我编程底子没有搭好,惭愧。要是这些语言我都会些,...
  • java调用dll动态库是有几种方式的,我这里选择的是jnative,下面附上代码。 注意点:jdk选择的是32位1.7版本,tomcat容器选择的是32位7版本 然后接口写完,在不同的机器上部署都出现不同的报错情况...
  • JNative的初步使用

    2015-03-26 18:11:56
    JNative_1.4RC2_src.zip : http://jaist.dl.sourceforge.net/sourceforge/jnative/JNative_1.4RC2_src.zip JNative.jar : http://nchc.dl.sourceforge.net/sourceforge/jnative/JNative.jar 如果以上版本不...
  • 环境: jdk1.7_32位 window server 2012 tomcat7.0安装版概况:在项目开发中,使用java的JNative调用window下的dll文件,在项目上线的初期试点,业务量不大的时候一切正常,但是随着使用的用户量变大,tomcat的...
  • 因为项目需求,需要在java中调用...1. 安装到jnative.sourceforge.net下载最新的JNative二进制包,解压得到3个文件:JNativeCpp.dll,libJNativeCpp.so,JNative.jar,其中:JNativeCpp.dll 放在windows/system32目
  • 这两天了解了一下java调用dll动态库的方法,总的有三种:JNI、JNA、JNative。其中JNA调用DLL是最方便的。 ·JNI ·JNA ·JNative java使用 JNI来调用dll动态库的调用,工作量略大,一般情况下开发人员会选用JNA或...
  • 因为项目的需求,要在JAVA项目中调用...在网上找到一个开源的组件JNative使用后感觉比较方便。 下截JNative组件 jnative.sourceforge.net/ 到这里下载JNative开源项目,我下载的是1.3.2 解压JNativ
  • JNative调用dll打印

    2013-12-19 11:11:59
    最近项目需要调用触摸屏上的打印机,硬件提供方只提供了调用打印机的dll文件,需要项目组自己用java开发调用dll代码。在网上看了些资料,很多介绍JNI或JNA文档都写的不清楚或写的很复杂,决定自己顺便整理下,以作...
  • 现在我有一个 dll 文件,但是需要调用的方法是在一个类中,请问该如何调用到这个方法呢? 要调用的方法不是静态的,应该需要new对象才能调到,问题就出现在这里了,求各位大神解答! ![图片说明]...
  • JNative是供java直接调用c++dll的工具包,这样java程序员仅仅知道c++dll中的函数名和参数类型就可以直接调用dll 了,省去了使用JNI的繁琐。 下面是一个使用c++dll回调函数的例子: dll名字JNativeTest.dll   ...
  • JNative是一种能够使Java语言使调用DLL的一种技术,对JNI进行了封装,可能有些读者会有这样一个问题,JNative对JNI进行了封装,并且是一种跨语言的使用DLL,会不会在效率方面很不如人意,我可以用我使用Jnative的经验...
1 2 3 4 5 ... 13
收藏数 254
精华内容 101