JAVA和MATLAB混合编程及其应用
2020-04-22
来源:爱问旅游网
维普资讯 http://www.cqvip.com 第8卷第14期2008年7月 科学技术与工程 Vo1.8 No.14 July 2008 1671-1819(2008)14-3953-04 Science Technology and Engineering ⑥2008 Sci.Tech.Engng. JAVA和MATLAB混合编程及其应用 陈怀铭蔡剑卿黄春晖 (福州大学物理与信息工程学院电子系,福州350002) 摘要JAVA和MATLAB的编程有各自的优缺点。将它们结合起来进行混合编程能够充分发挥它们各自的优点,弥补单独 编程的不足之处。本文介绍了通过JNI技术实现JAVA对MATLAB调用的方法,并说明了其在量子密码通信中的一个应用。 关键词JAVA MATLAB 量子密码 混合编程 A 中图法分类号TP311.11; 文献标志码MATLAB是由Mathwork公司推出的一种高性 能的数值计算和可视化软件。它的编程比较简单, 有强大的矩阵运算及图形显示能力,还有多样化的 各种工具箱可供使用,在数值分析、信号处理、系统 辨识、特殊函数和图形等方面具有广泛的应用。不 过,由于MATLAB是一种解释性语言,执行效率比 较低,而且它并不适用于通用的编程平台,这就大 1 通过JNI技术调用MATLAB Engine 函数 通过JAVA的JNI技术调用MATLAB向C/C++ 语言提供的MATLAB Engine函数,能实现JAVA程 序对MATLAB程序的调用。 1.1 JNI技术 大限制了它的应用场合。 JAVA是由Sun公司开发的一种面向对象的程 JAVA的JNI技术 是JAVA Native Interface的 简称,意思是本地编程接口。Java语言是一种功能 序设计语言。它具有简单、跨平台、分布式、解释 性、可靠、安全、结构中立性、可移植性、高性能、线 程等优点,已被广泛应用于开发各种商业软件。但 是,JAVA对某些比较复杂的数学运算的编程比较 很强的编程语言,应用程序如果能全部用JAVA语 言来编程固然很好。但在实际的编程过程中,如果 已经有了大量测试过和调试过的其它语言的代码, 将这些代码移植成JAVA语言很费时间,而且产生 繁琐,处理速度也较慢。 因此,如果能在JAVA程序中调用MATLAB程 的代码还需要再次测试和调试。这时候如果能在 JAVA中使用其他语言将会减少开发的时间。JAVA 语言提供的JNI技术,使得JAVA程序代码能够调 用使用其他编程语言(如c++)编程的有关知识。 JNI最重要的好处是它没有对底层JAVA虚拟机的 实现施加任何限制。因此,JAVA虚拟机的厂商可 序来处理一些比较复杂的数学运算,充分发挥 MATLAB强大的数学运算能力和仿真功能,就能弥 补单独编程的缺点,提高编程效率和加快处理速度。 以在不影响虚拟机其他部分的情况下添加对JNI的 2008年3月25日收到福建省自然科学基金项目(z0512003)资助 第一作者简介:陈怀铭(1982一),男,福州大学硕士生,研究方向: 集成电路设计与应用。E-mail:nedvedchm@sohu.com。 ’通信作者简介:黄春晖,男,福州大学教授,研究方向:集成电路设 计与应用。 支持。程序员只需编写一种版本的本地应用程序 获库,就能够与所有支持JNI的JAVA虚拟机一起 工作。 1.2 MATLAB Engine函数 MATLAB Engine函数 是指一组MATLAB提 维普资讯 http://www.cqvip.com 3954 科学技术与工程 8卷 供的面向c/c++和Fortran等语言的接口函数,用户 可以通过在其它编程环境中调用这些接口函数,实 现对MATLAB的控制。通过MATLAB Engine,应用 C:\MATLAB目录)。 2)选择Library files,添加路径:C:\MATLAB\ extem|lib|win32|microsoft|msvc60 程序会打开一个新的MATLAB进程,可以控制它完 3)通过菜单工程一设置,进入连接页面,在对 成任何计算和绘图操作。同时,MATLAB Engine方 式打开的MATLAB进程会在任务栏显示自己的图 标,打开该窗口,可以观察主程序通过engine方式 库模块编辑框中,添加文件名libmx.1ib libmat. 1ib libeng.1ib libmatlb.1ib。 控制MATLAB运行的流程,并可在其中输入任何 MArI1AB命令。 常见的MATLAB Engine函数有: engOpen:开启Maflab Engine。 engClose:关闭Maflab Engine。 engGetVariable:从Matlab Engine中获得一个Matlab矩阵,用于 数据交换。 engEvalString:执行一个Matlab命令。 engPutVariable:从应用程序向Matlab Engine发送一个Matlab矩 阵,用于数据交换。 engOutputBuffer:创建字符缓冲区以获取Matlab文本输出。 1.3 JN!技术调用MATLAB Engine函数的基 1)编写JMatLink.java,将所有要调用到的 MATLAB Engine函数定义成native。 2)在JMatLink.java中加入static的System. 1oadLibrary(”JMatLink”)。 3)使用javac编译JMatLink.java生成 JMatHnk.class。 4)使用javah-jni JMatLink.class来生成 JMatLink.h。 5)在VC中创建动态链接库工程JMatLink.dll, 将JMatLink.h文件加入工程中。 6)编写实现JMatLink.h文件对应的JMatLink. cpp文件。 7)编译JMatLink.dll文件,将JMatLink.du文件 放到JMatLink.java的目录中。 要在VC中成功编译JMatLink.dll,必须在 JMatLink.cpp包含MATLAB Engine头文件engine.h 并引入MATLAB对应的库文件libmx.1ib、libmat. 1ib、libeng.1ib、libmatlb.1ib。具体的设置如下: 1)通过菜单工具一选项,进入目录页面,在目 录下拉列表框中选择Include files,添加路径:”C:\ MATLAB\extern\include”(假定MATLAB安装在 2混合编程在量子密码通信中的应用 加密是保障信息安全的重要手段之一。当前 最常用的加密技术是用复杂的数学算法来改变原 始信息。这种方法虽然安全性较高,但存在被破译 的可能,并非绝对可靠。而量子密码是一种截然不 同的加密方法,主要利用量子状态作为信息加密和 解密的密钥。任何想测算和破译密钥的人,都会因 改变量子状态而得到无意义的信息,而信息合法接 收者也可以从量子态的改变而知道密钥曾被截获 过。从理论上来说,用量子密码加密的通信不可能 被窃听,安全程度极高。1984年,Bennett和Bras. sard在研究中发现,单量子态虽然不好保存但可用 于传输信息,两人共同提出第一个量子密码分配协 议BB84协议 。 丹麦Aarhus大学用JAVA语言编写了一个模 拟量子密钥分配协议的软件平台——Qucrypt,利用 它在互联的计算机上实现了对BB84协议和B92协 议的模拟。现在要在QuCrypt软件平台上模拟另外 一种量子密钥分配协议——Reverse Reconciliation Gauss—moduled QKD协议 。 Reverse Reconciliation Gauss.moduled QKD协议 (简称RR协议) 是基于连续变量的一种量子密 钥分配协议。在QuCrypt平台上模拟RR协议共分 为三步:首先,由发送方通过QuCrypt软件的量子信 道发送连续调制相位和幅度的相干光脉冲来获得 具有高斯分布的密钥信息,同时接收方进行零差拍 的探测。然后,通信双方执行样条纠错算法(slice 算法)将连续变量的密钥转换成离散的二进制密 钥。最后,双方再通过QuCrypt软件的公共信道进 行比较,得到最终密钥。在这个过程中,第二步的 维普资讯 http://www.cqvip.com l4期 陈怀铭,等:JAVA和MATLAB混合编程及其应用 ird3=fopen( ̄oodkey.txt.}’ 3955 slice算法是用MATLAB语言编写的,而通信平台是 JAVA语言编写的。因此,这就要求在JAVA的程序 中实现对MATLAB程序的调用。 2.1 Slice算法的MATLAB程序 slice算法是实现将连续的高斯变量离散化的 算法。假设发送方拥有一连串的高斯变量 (】… , pos=fscanf(rid3,%c, fclose(rid3); goodkey=1; f0ri=1:numall: %如果采用相同基,则保留该随机数 if(pos(i)==~1) X(goodkey)=rawx(i); 接收方也拥有 。 ,由于信道噪声的存在X =X 。+占,占~N(O,o-)。函数 ( )可以将初始密钥转换 成mbit的二进制数 .... ( )=( ( ),…, ( ))。图1表示的是m=3的情况: ;2s3I fX:)()::0o 1 8 001 1 1 0 0 7 1 1 0{ 11 /,一 ● 一 —— 、、 x) 。\ ./ /。 p(\ X 图1 连续变量离散化示意图 尸( )是变量的概率密度分布函数,依据一定 的规则划分为2 片段,在 轴上对应的区间为[ , + ](0<≤i≤2 一1)。每一个区间对应密码本中 特定的 .... ( )。量化时首先判断变量 落在那一 个区间里,然后再映射到相应的S卜. (X)。同理,接 收方量化得到S.... ( ’。把 .... ( )和S.... ( ’又 称为“Slice(片段)”。 MATLAB源代码的核心部分及其说明如下: %t是总的量化区间 t=[一lO,一2.347,一1.808,一1.411,一1.081,一0.768, 一0.514,一0.254,0,0.254,0.514,0.768,1.081,1.411,1.808, 2.347,10.0]; %共有5000个随机数 numall=5000; varianeel=1; %打开保存随机数的文件 ird=fopen( ̄iggurat.txt; randn= ̄anf(rid,% ; fclose(rid); f0ri=1:numan; %X是发送方送出的数 mwx(i)=varianee1.{randn(i); end %goodkey保存了发送方和接收方采用相同基的位 Y(goodkey):rawy(i); goodkey=goodkey+1; else goodkey=goodkey; end end goodkey=goodkey一1; %将发送方的值量化成四位二进制数 f0ri=1:goodkey; for k=1:16; d=k一1; if X(i)>=t(k)&x(i)<=t(k+1) sxl(i)=mod(d,2); sx2(i)=mod(fix(d/2),2); sx3(i)=mod(fix(fix(d/2)/2),2); sx4(i)=mod(fix(fix(fix(d/2)/2)/2),2); break; end end end 2.2 JAVA程序的实现 为了在QuCrypt软件平台上调用MATIJAB En. gine函数,首先,把JMatLink.java,JMatLink.class和 JMatlink.dll加到QuCrypt软件的程序里面。然后, 用JAVA编写一个界面程序Jmatlabtest.java也加人 到程序里面,JMatLink.java的功能是建立一些按 钮,只要按下这些按钮,就可以调用由MATLAB编 写的slice算法。它运行后的界面如图2所示,其 中,slicel,slice2,slice3,slice4就是slice算法。 Jmatlabtest.java中先要在程序的开头新建 MATLAB Engine函数的对象: JMatLink eng=new JMatLink(); Jmatlabtest.java中实现按钮功能方法的核心代 码如下: class Btnl implements AetionListener{ pubhc void acfionPerformed(ActionEvent e) 维普资讯 http://www.cqvip.com 3956 1 科学技术与工程 8卷 令窗口中输人workspace后可以跳出MATLAB工作 区间,在工作区间中就能对程序中的一些变量进行 操作处理了。 eng.engOpen();//打开MATLAB Engine函数 eng.engEvalString(……);//执行括号里面的程序 eng.engClose();//关闭MATLAB Engine函数 } l 3小结 通过MATLAB Engine函数来实现JAVA程序 eng.engEvalString(……)的括号里面是经过修 改过的实现slice算法的MATLAB代码。这些代码 是先将原来的MATLAB代码整个拷贝过来,然后修 对MATLAB程序调用的方法和应用,要利用VC作 改代码中一些在MATLAB环境下和JAVA环境下不 为中介,建立一个JAVA和MATLAB Engine函数相 同的符号。比如,在WINDOWS中,MATLAB程序的 关联的JMatLink库。因此,在处理数据量非常大的 路径分隔符号是“\”,而JAVA程序的路径分隔符号 程序中,这种方法会比较慢。但是,这种方法只需 则是“/”。又比如,MATLAB程序的注释符号是 要建立一次JMatLink库,以后只要根据需要增加 “%”,而JAVA程序的注释符号是“//”。图2中的 JMatLink库里面的MATLAB Engine函数。而且,在 转化代码按钮就是实现这些功能的。 JAVA程序调用MATLAB程序的过程中对原来的 MATLAB代码改动较少,这就能够充分利用好很多 现有的MATLAB代码。使用JAVA和MATLAB进 行混合编程可以提高程序处理速度和简化程序处 理过程,在需要复杂的数学运算与数学仿真的领 域,必将会得到越来越多的应用。 参考文献 Cay S,Cornel1.Gary JAVA2核心技术卷2第7版.陈吴鹏,王浩, 姚建平,等译.北京:机械工业出版社,2006:717—759 图2 Jmatlabtest界面 余啸海.Matlab接口技术与应用.北京:国防工业出版社,2004 Bennett C H,Brassard G.Quantum cryptography:pablie key distribu— 按下图2中“执行slicel”按钮后,就会跳出一 tion and coin tossing.In:Proceedings of IEEE International Conference 个MATLAB命令窗口。在命令窗口中可以输入 on Computers,Systems and Processing.Bangalore,1984;175 Grosshans F,Grangier P.Reverse reconciliation protocols for quan— MATLAB命令来观察程序运行的状况。比如,在命 turn cryptography with continuous variables.Nature。2003:42 1—u238 Mixed Programming of JAVA and MATLAB and Its Application CHEN Huai—ming,CAI Jian—qing,HUANG Chun—hui (Dept.of Electronics,College of Physics and Information Engineering,Fuzhou University,Fuzhou 350002, R.China) [Abstract] JAVA and MATLAB programming have their own advantages and disadvantages.The combination of them for mixed programming can develop the advantages and make up the disadvantages in single programming. A method to use MATLAB in JAVA through JNI technology is introduced and its applieatied in quantum cryptogra— phy communication. [Key words] JAVA MATLAB quantum cryptography mixed programming