Java(JNA)调用C++动态库(dll)

北城余情 提交于 2020-12-14 07:03:31

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是先测试后,再在项目中运用,上面两种方式均成功。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!