当前位置 博文首页 > 文章内容

    学会改变自己——才能突破:Jna调用动态链接库

    作者:shunshunshun18 栏目:未分类 时间:2021-10-17 20:51:40

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



            最近由于工作需要,在和其它系统交互的问题上不仅仅是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程序的面。非常方便的,当然了还有其他方法,不断学习中……

     

    cs