首页 > 代码库 > Jna调用动态链接库
Jna调用动态链接库
最近由于工作需要,在和其它系统交互的问题上不仅仅是WebService的交互,还需要利用Java调用其它语言编写的动态链接库,例如编译好的dll文件.好,简单看一下这个问题的来源。
我们的系统和其它系统进行交互的时候,需要网络这个阶段,这段期间数据很容易被截获,这就需要对一些敏感的数据进行加密。通常单个系统我们会用MD5进行加密,无法逆向破解,相对来说还是比较安全的,已经足够使用了。但是为了网络中传输的数据也是密文,这就需要再次进行加密了,所谓的私钥,公钥。经典的例如:DES,加强版3DES等。好先看一下简单流程:
这种情况下,A系统是建立在B系统的基础之上的,随意加密算法我们需要和B用一套,一般情况下,用B系统语言写的(当然A也可以),A是利用Java进行开发的,B是利用delphi,C,C++等编写的,所以我们就需要利用Java来调用其他语言编译好的Dll等文件,就像我们Java的.class文件一样。好这里看一种比较方便简单使用的JNA。
JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个Java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。
优点:JNA可以让你像调用一般java方法一样直接调用本地方法。就和直接执行本地方法差不多,而且调用本地方法还不用额外的其他处理或者配置什么的,也不需要多余的引用或者编码,使用很方便。
简单看一下流程操作,首先下载jna.jar,并引入到项目中,然后看一下下边的代码
package com.ljh.until;import com.sun.jna.Native;import com.sun.jna.win32.StdCallLibrary;/** * 测试jna调用本地接口 * @author ljh * */public class testJna { //上层接口 //需要继承stdCallLibrary,一种协议,当然也可以直接继承Library上层接口,看对方的DLL文件的编写遵从哪一种协议, 这个是jna标准 //必须定义一个接口,将Dll文件的方法提取出来,注意类型的对应 public interface EncrypStrTest extends StdCallLibrary { //加载动态链接库,把库dll文件默认放到系统C盘window目录下的system32文件夹下或者到java的bin目录 EncrypStrTest instance = (EncrypStrTest)Native.loadLibrary("Dll文件的名字", EncrypStrTest.class); //定义接口, public String EncrypString(String aSrc, String aKey);//定义接口 } //测试 public static void main(String[] args) { try{ EncrypStrTest jnaDemo=EncrypStrTest.instance; String resultString=jnaDemo.EncrypString("参数一","参数二"); System.out.println("会有结果么:" + resultString); }catch(Exception e){ e.printStackTrace(); } }}
这样我们就可以调用其它语言的dll控件了,而windows本身提供了很多dll控件我们就可以通过JNA进行本地方法的调用了,这样大大扩展了Java程序的面。非常方便的,当然了还有其他方法,不断学习中……
Jna调用动态链接库