zoukankan      html  css  js  c++  java
  • Java(JNA)调用C++动态库(dll)

    JNA(Java Native Access):是建立在JNI之上的Java开源框架,SUN主导开发,用来调用C、C++代码,尤其是底层的库文件(windows中叫dll文件,linux下是.so文件)。

    先注意几个问题:

    1.下载jna.jar包,jna-platform.jar 可以不要,但是有的话对代码的调试是有帮助的;platform.jar对于jna.jar是一种补充和扩展,jna.jar相当于核,platfrorm.jar相当于增量插件。

    2.动态链接库编译时的平台。如果是通过x86平台编译,那么就只能使用32位的jdk环境加载,如果是64位jdk就必须使用x64平台编译动态库;不然,即使后面编码,动态链接库的路径都没有问题,调用还是会报错。

    3.调用时多注意dll的位置。

    代码开始:

    对于Java来说,一般都是调用已经生成好的dll动态库。所以LZ并没有贴动态库的生成。若需要,百度一下即可。

    public class JNATestDll {
        public interface Dll extends Library{        
            Dll instance = (Dll) Native.loadLibrary("HidComm", Dll.class);
            public boolean LoadHidComm();
            public boolean HidWriteData(String buf,int len);
        }
        public static void main(String[] args) {
            boolean load = Dll.instance.LoadHidComm();
            if (load) {
                String buf = "weixin://wxpay/bizpayurl?pr=FCT5hbP";
                int len = buf.length();
                boolean ewm = Dll.instance.HidWriteData(buf, len);
                System.out.println(ewm);
            }
        }
    }

    这是普通的Java项目的调用测试,LZ是把dll动态库放到项目的根目录下的,就是选中项目然后复制就ok了。

    下面这个例子是web项目中调用dll动态库示例:

    public class JnaCallDllService {
        private static String path = System.getProperty("user.dir").concat(File.separator).concat("lib").concat(File.separator);
        
     
        public interface SerialAndDllNew extends Library {
            SerialAndDllNew instance = (SerialAndDllNew)Native.loadLibrary(path.concat("zzcard"), SerialAndDllNew.class);
            
            public int Icc_OpenComPort(int nPort, String gate, int baud, int timeout);
            
            public int Icc_PowerOn(int card_no,ByteByReference atr,ShortByReference ictype);
        }
    }

    path部分就是动态库的路径,因为LZ的应用是要放到linux环境下部署的。LZ是把动态库放到lib下的,这样方便部署,简单方便。如下图所示:

    LZ是先测试后,再在项目中运用,上面两种方式均成功。

    作者:Joe
    努力了的才叫梦想,不努力的就是空想,努力并且坚持下去,毕竟这是我相信的力量
  • 相关阅读:
    Justoj 2389: 拼接三角形 二分查找
    P4513 小白逛公园(线段树求区间最大子段和)
    勾股数
    费马大定理
    D1. Kirk and a Binary String (easy version)
    Find the median(线段树离散化+区间更新)
    String
    最小表示法
    扩展KMP模板(学习)
    K-th Closest Distance
  • 原文地址:https://www.cnblogs.com/Joe-Go/p/9614194.html
Copyright © 2011-2022 走看看