精华内容
下载资源
问答
  • Java调用动态链接库 Java 调用 DLL 源码
  • 使用Java调用dll动态链接库

    千次阅读 2016-11-30 19:04:23
    DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中...

    一:什么是dll?

    DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。
    写成dll文件大多是用C、VB、Delphi语言编写的,具体如何写就不考虑了,有现成的就行了。

    二:Java语言该如何调用dll?

    采用JNative技术为例:

    首先将要调用的dll引入本地工程中:
    1. 首先下载JNative.jar包,将jar包导入工程中;
    2. 然后找到JNative.jar包中的JNativeCpp.dll(在windows环境中,Linux环境中用libJNativeCpp.so)
    3. 接着将 JNativeCpp.dll 和 要引入的dll文件 放入C:\Windows\System32 目录下;以及 jdk的bin目录下(因为dll文件中会用到.dat,.lib文件);如果是web动态工程用到Tomcat,还需要放到Tomcat的bin目录下;
    4. 还有一种方法是将他们直接放在本地工程中,加载本地文件;右击工程—Built Path—Source—Web App Libaries—Native library location:(none) — edit,选择本地放的dll文件夹就可以了。

    引入完后,开始写Java代码:
    在程序中加载dll文件有两种写法:
    ①:loadLibrary方法: 把dll文件拷贝到C:\Windows\System32目录 下, 引用时,只需要写dll文件名字即可。

    System.loadLibrary("ZCDogChk"); // ZCDogChk 为dll文件名字

    ②: load方法: 写dll文件的完整路径

    System.load("D:\\RegisterPlatform\\ZCDogChk.dll");

    通过System.getProperty(“java.library.path”)查看路径位置

    System.out.println(System.getProperty("java.library.path"));

    // “ZCDogChk” 为dll文件名, “fChkDogRegNumZC” 为要调用的函数名

    JNative jNative = new JNative("ZCDogChk", "fChkDogRegNumZC");
    jNative.setRetVal(Type.STRING);  // 设置调用后的返回值类型
    jNative.setParameter(0, str);  //参数下标是从0开始
    jNative.getFunctionName();    //dll 函数名   
    jNative.getDLLName();   //dll文件名
    jNative.invoke();  //执行dll方法
    jNative.getRetVal(); //获取返回结果
    展开全文
  • 海康威视 综合安防管理平台8700 java调用C++接口,提供录像下载相关功能! maven项目,Eclipse导入注意!
  • java调用DLL动态链接库

    千次阅读 2018-08-13 09:15:53
    1.加载动态链接库 public static String strFilePathSmartDevice = "C:\\Windows\\System32\\JsBin\\SmartDevice.dll";//dll所在目录 // public static String strFilePath = System.getProperty(&...

    1.加载动态链接库

    	public static String strFilePathSmartDevice = "C:\\Windows\\System32\\JsBin\\SmartDevice.dll";//dll所在目录
    	
    //	public static String strFilePath = System.getProperty("user.dir") + "..\\..\\..\\..\\DLL开发包\\windows\\64bit\\WTY.dll";
    	public static dll INSTANCE = (dll)Native.loadLibrary(strFilePathSmartDevice, dll.class);//关联dll

    2.根据dll提供的SDK实现接口

    (1)实现普通接口

    函数原型:bool SmartDevice_Init(unsigned short tcpPort, int logLevel);

    接口实现:

    /**
    	 * 智能设备SDK初始化,其他功能必须在正确初始化后才能使用,程序运行并且只能初始化一次
    	 * @param tcpPort
    	 * @param logLevel
    	 * @return
    	 */
    	public boolean SmartDevice_Init(int tcpPort, int logLevel);

    (2)包含回调函数的接口实现

    接口函数原型:void SmartDevice_SetCallBack(SmartDevice_CallBack callback);

    回调函数原型:typedef bool(__cdecl *SmartDevice_CallBack)(char* deviceID,unsigned short cmd, char* json,int len);

    接口实现:

    /**
    	 * 智能设备SDK设置回调函数
    	 * 此回调函数设置后,心跳、设备搜索、记录上传、事件上传、设备状态会通过此回调函数通知调用方
    	 * @param callback
    	 */
    	public void SmartDevice_SetCallBack(SmartDevice_CallBack callback);

    回调函数实现:

    package cn.com.startinfo.zhtc.callback;
    
    import com.sun.jna.Callback;
    import com.sun.jna.win32.StdCallLibrary.StdCallCallback;
    
    /**
     * 回调函数实现
     * @author Administrator
     *
     */
    public interface SmartDevice_CallBack extends StdCallCallback  {
    	/**
    	 * 此回调函数设置后,心跳、设备搜索、记录上传、事件上传、
    	 * 设备状态会通过此回调函数通知调用方,回调函数请不要阻塞,
    	 * 否则会影响该设备通信,界面显示处理逻辑尤其是需人工交互的请不能在回调函数中处理
    	 * @param deviceID 4字节厂商编号+4字节主设备编号+12字节MAC地址数(或者唯一编号)共20字节
    						例如:JSTC180100189900044C
    	 * @param cmd
    	 * @param json  心跳、设备搜索、记录上传、事件上传、设备状态对应json数据格式
    	 * @param len   设备发给网关的json数据长度
    	 */
    	public void MessageHandle(String deviceID,int cmd,String json,int len);
    }

    messageHandle方法实现:

    package cn.com.startinfo.zhtc.callbackImpl;
    
    import java.nio.ByteBuffer;
    
    import com.google.gson.Gson;
    import com.sun.jna.Memory;
    import com.sun.jna.Pointer;
    
    import cn.com.startinfo.zhtc.Thread.HardwareData;
    import cn.com.startinfo.zhtc.callback.SmartDevice_CallBack;
    import cn.com.startinfo.zhtc.dll.TestMain;
    import cn.com.startinfo.zhtc.dll.dll;
    import cn.com.startinfo.zhtc.utils.Command;
    import cn.com.startinfo.zhtc.utils.CommandNumber;
    import net.sf.json.JSONArray;
    import net.sf.json.JSONObject;
    
    
    /**
     * 此回调函数设置后,心跳、设备搜索、记录上传、事件上传、
     * 设备状态会通过此回调函数通知调用方,回调函数请不要阻塞,
     * 否则会影响该设备通信,界面显示处理逻辑尤其是需人工交互的请不能在回调函数中处理
     * @author Administrator
     *
     */
    public class SmartDevice_CallBackImpl implements SmartDevice_CallBack {
    
    
    	public boolean MessageHandle(String deviceID, int cmd, String json, int len) {
    		System.out.println("搜索等功能回调:");
    		System.out.println("deviceID:"+deviceID);
    		TestMain.deviceID1 = deviceID;
    		System.out.println("cmd:"+cmd);
    		System.out.println("json:"+json);
    		System.out.println("len:"+len);
    		JSONObject JsonReturn=JSONObject.fromObject(json);
    		if(JsonReturn.getString("command").equals(Command.COM_UPLOAD_RECORD_JS)){
    
    			JSONArray result = JsonReturn.getJSONArray("data");
    			new HardwareData(JsonReturn).start();
    		}
    		
    		if(cmd == 1){
    			Pointer p = new Memory(81920);
    			ByteBuffer buffer = ByteBuffer.allocate(81920);
    			String update = "{\"command\":\"COM_MODIFY_IP_PORT_JS\",\"data\":[{\"type\":\"\",\"hasInit\":1,\"deviceID\":"+deviceID+",\"manufacturer\":\"\",\"macNO\":0,\"locationAddr\":\"\",\"name\":\"\",\"gateWay\":\"192.168.1.1\",\"ip\":\"192.168.1.98\",\"mac\":\"00:18:99:03:15:BF\",\"mask\":\"255.255.255.0\",\"version\":\"ST_PARK_APP_SDK_v1.0.0\",\"masterIP\":\"192.168.1.108\",\"port\":20001}]}";
    			int a1 = dll.INSTANCE.SmartDevice_Common(deviceID,CommandNumber.COM_MODIFY_IP_PORT_JS, update,update.getBytes().length,buffer, p);
    		
    			//			System.out.println("a1:"+a1);
    		}
    		return true;
    	}
    }
    

    注:dll数据格式与java数据格式对应时几个需要注意的地方:

    DLL中的char*数据格式对应java中的ByteBuffer数据格式

    DLL中的int*数据可是对应java中的Pointer数据格式

    使用Pointer需要加入jna jar包:

    <!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna -->
    		<dependency>
    			<groupId>net.java.dev.jna</groupId>
    			<artifactId>jna</artifactId>
    			<version>4.1.0</version>
    		</dependency>

     

    展开全文
  • Java调用dll动态链接库环境配置1.在调用前确定系统路径下存在要调用的dll所需的其他dll(检测工具)2.本机eclipse调试时eclipse使用本机jdk),将要调用的动态链接库及其放在jdk的bin目录下,config文件放在jre的bin...

    Java调用dll动态链接库环境配置

    1.在调用前确定系统路径下存在要调用的dll所需的其他dll(检测工具)

    2.本机eclipse调试时eclipse使用本机jdk),将要调用的动态链接库及其放在jdk的bin目录下,config文件放在jre的bin路径下

    3.服务器上启动tomcat测试,将要调用的动态链接库及其放在tomcat的bin目录下,config文件放在tomcat调用的jdk的jre的bin路径下


    展开全文
  • java调用动态链接库 dll

    千次阅读 2017-04-12 14:28:58
    最新使用java开发桌面程序,涉及到使用java调用二代身份证读卡获取人员身份、照片信息,使用厂家提供的SDK包,始终无法成功调用,碰到过很多问题,这里记录一下。最开始使用windows7 64操作系统,JDK64位,调用时要么...

             最新使用java开发桌面程序,涉及到使用java调用二代身份证读卡获取人员身份、照片信息,使用厂家提供的SDK包,始终无法成功调用,碰到过很多问题,这里记录一下。最开始使用windows7  64操作系统,JDK64位,调用时要么出现:Unable to load library错误,要么出现接口方法无法初始化.厂家提供的是JNative.jar调用方式,经过查询,发现JNative不支持JDK64位,一度怀疑是厂家提供的动态链接库在64位操作系统下无法使用,想要厂家提供64位的动态链接库,结果厂家不搭理,只能自己想办法了。经过多次测试终于使程序可以正常在windows7 32位和windows 7 64位操作系统上正常运行:

       这里使用的是jna调用jar:

     

    使用jna进行调用,在win7 32位操作系统:

    动态链接库文件:

    1)将动态链接库拷贝到:

    C:\Windows\System32 目录下.

    2)将动态链接库拷贝到项目的src目录下,编译后在bin目录中.

    加载时:

    String path= TestDlg.class.getResource("/").getPath().substring(1).replace("/","\\")+ "SynIDCardAPI";

                       SynIDCardAPIINSTANCE =(SynIDCardAPI)Native.loadLibrary(path,SynIDCardAPI.class);

    3)在32位操作系统下自然使用JDK32


    使用jna进行调用,在windows7 64位操作系统下:

    使用JDK32版本,eclipse 32位,那么动态链接库都要拷贝到两个位置:

    1)拷贝到C:\Windows\SysWOW64目录下(在64位操作系统下,可能是由于动态链接库的问题,还是只能使用32位的JDK,使用64位jdk还是无法正常使用,动态链接库拷贝到SysWOW64下,不要拷贝到System32)

    2)将动态链接库拷贝到项目的src目录下,编译后在bin目录中

    加载时:

    String path= TestDlg.class.getResource("/").getPath().substring(1).replace("/","\\")+ "SynIDCardAPI";

                       SynIDCardAPIINSTANCE =(SynIDCardAPI)Native.loadLibrary(path,SynIDCardAPI.class);

    3)在64位操作系统下,也使用JDK32,这个可能和使用的动态链接库有关,或许我使用的动态链接库就是32位的。不确定如果是64位的动态链接库是否可以正常运行.

    使用过程中,一般容易报:

    Unable to load library

     java.lang.UnsatisfiedLinkError: com.sun.jna.Native.pointerSize(),

    java.lang.NoClassDefFoundError: Could not initialize class com.synjones.angel.TestDlg$SynIDCardAPI


    错误原因:

       1.动态链接库位置不对。

       2.jdk 使用32或64位未匹配出现的问题。





    展开全文
  • JAVA调用动态链接库DLL之JNative学习源码,详细请参考:http://blog.csdn.net/testcs_dn/article/details/26980027
  • Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也能带来跨平台性。使用JNI、Jawin和Jacb使得Java在Windows平台下使用COM和 DLL的更加方便。   Java语言本身具有跨平台性,如果通过Java调用...
  • ![图片说明](https://img-ask.csdn.net/upload/201507/14/1436856235_796498.jpg) 求大神解救!我要用jna调用visual basic 封装的dll ;但是我要调用的方法在dll 的对象的对象属性的方法!S0S!
  • JAVA调用DLL时,不知该如何调用下面方法 已知DLL中的方法如下。 struct CSTD_point_2d { int x; int y; }; typedef struct CSTD_point_2d CSTD_point_2d_t; //conce //stability 稳定度 //...
  • Java程序中加载dll动态链接库有两种方法: 第一种:通过调用System.loadLibrary(String filename); 第二种:通过调用System.load(String filename)方法。 第一种参数filename直接写动态链接库的名字,例如System....
  • 此附件包含了java代码以及vs2013编写的动态库工程。
  • java调用C语言动态链接库
  • 因为项目的需求,要在JAVA项目中调用Windows的Dll(动态链接库)文件,之前用Jni调用过C写的Dll文件,比较麻烦,这里不多说,网上也有很多这方面的文档。在网上找到一个开源的组件JNative,使用后感觉比较方便
  • Java调用dll动态库

    2018-06-07 19:38:42
    一、什么是dll文件 DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL...
  • java调用dll接口

    2016-03-31 17:44:46
    java调用dll接口,备份供大家察看,谢谢大家共享。
  • 用java调用C或C++动态链接库原来如此简单 java调用dll
  • Java通过JNA方式调用DLL(动态链接库)

    千次阅读 2019-09-12 13:59:35
    1. JNA简单介绍 先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java...可见步骤非常的多,很麻烦,使用JNI调用.dll/.so共享都能体会到这个痛苦的过程。如果已有一个编译好的.dll...
  • java调用动态链接库例程(测试通过)及库包 jna4.3 完整资源,demo。 jna 4.3 、示例 dll ,调用demo
  • JavaWeb项目中调用dll动态链接库

    万次阅读 2017-01-07 13:45:53
    介绍 先简单介绍下遇到的问题,需要在web页面中增加身份证内的头像图片。头像图片已经通过身份证采集器采集并存储在Oracle数据库的blob中。但是存储的二进制数据是...Java调用dll动态链接库 最先尝试的是JNI的方法,
  • PAGE / NUMPAGES Java调用动态链接库.DLL) .dll文件用一般使用何种语言何种软件编写 .dll文件一般用 C语言VC++DelphiC#等语言和相应的 开发工具编写如果要考虑广泛的兼容一般使用VC++或者C语言编写可供...
  • 这个是使用JNA调用.dll文件或.so文件动态链接库的例子
  • 由于之前一直没有接触过用Java调用C++,目前正在考虑用C++写主要的算法,然后用Java来调用。通过查找资料,发现要嘛用通信的方式,要嘛就使用JNI,也就是Java Native Interface的简称,中文是“Java本地调用”。通常...
  • Java调用DLL动态链接库的JNI方式详解

    千次阅读 2013-12-10 16:32:04
    使用Java调用DLL动态链接库的方案通常有几种方式:JNI, JNative,Jawin, Jacob.其中 JNative,Jawin, 调用方式很简单,google一下即刻解决,但是这两种方式都已不支持64系统, 这给一些带来了障碍; Jacob是Java-...
  • java调用动态库实例

    2017-02-17 11:51:52
    包括java调用动态库的实例与总结,其中有jna调用动态库和jnative调用动态库,分为直接java文件main方法调用和web项目中的servlet调用两种方法
  • 非常好用java调用c++ dll文件demo 直接可以用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,435
精华内容 6,574
关键字:

java调用dll动态链接库

java 订阅