标签:通过 示例 文件 ref src jna path get win
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是先测试后,再在项目中运用,上面两种方式均成功。
标签:通过 示例 文件 ref src jna path get win
原文地址:https://www.cnblogs.com/Joe-Go/p/9614194.html