<p class="f_center"><img src="http://dingyue.ws.126.net/2022/0307/e16c764cg00r8d0ex006id200p00046g00p00046.gif"/><br/></p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2022%2F0307%2F37d907dcj00r8d0ey000fd000u0004ug.jpg&thumbnail=660x&quality=80&type=jpg"/><br/>0x00 前言<br/></p><p id="0MRABMD7">Java可以通过JNI接口访问本地的动态连接库,从而扩展Java的功能。本文将以Tomcat环境为例,介绍通过jsp加载dll的方法,开源代码,记录细节。</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2022%2F0307%2F37d907dcj00r8d0ey000fd000u0004ug.jpg&thumbnail=660x&quality=80&type=jpg"/><br/>0x01 简介<br/></p><p id="0MRABMD8">本文将要介绍以下内容:</p><p><ul><li id="0MRABMFQ"></p><p id="0MRABMD9">基础知识</p><p></li><li id="0MRABMFR"></p><p id="0MRABMDA">Java通过JNI加载dll的方法</p><p></li><li id="0MRABMFS"></p><p id="0MRABMDB">jsp通过JNI加载dll的方法</p><p></li></ul><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2022%2F0307%2F37d907dcj00r8d0ey000fd000u0004ug.jpg&thumbnail=660x&quality=80&type=jpg"/>0x02 基础知识</p><p id="0MRABMDC">JNI,全称Java Native Interface,是Java语言的本地编程接口。可以用来调用dll文件</p><p id="0MRABMDD">调用JNI接口的步骤:</p><p id="0MRABMDE">1、编写Java代码,注明要访问的本地动态连接库和本地方法</p><p id="0MRABMDF">2、编译Java代码得到.class文件</p><p id="0MRABMDG">3、使用javah生成该类对应的.h文件</p><p id="0MRABMDH">4、使用C++实现函数功能,编译生成dll</p><p id="0MRABMDI">5、通过Java调用dll</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2022%2F0307%2F37d907dcj00r8d0ey000fd000u0004ug.jpg&thumbnail=660x&quality=80&type=jpg"/><br/>0x03 Java通过JNI加载dll的方法<br/></p><p id="0MRABMDJ">本节将要实现通过Java加载dll,在命令行输出"Hello World"</p><p id="0MRABMDK"><strong>1.编写Java代码,注明要访问的本地动态连接库和本地方法</strong></p><p id="0MRABMDL">HelloWorld.java:</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2022%2F0307%2F73c1a580j00r8d0ez000hd200bp006gg00bp006g.jpg&thumbnail=660x&quality=80&type=jpg"/><br/></p><p id="0MRABMDN">注:</p><p id="0MRABMDO">也可以使用System.load指定加载dll的绝对路径,代码示例:System.load("c:\test\Hello.dll");</p><p id="0MRABMDP">上述代码注明了要访问本地的Hello.dll,调用本地方法print()</p><p id="0MRABMDQ"><strong>2.编译Java代码得到.class文件</strong></p><p id="0MRABMDR">cmd命令:</p><p id="0MRABMDS">命令执行后,生成文件HelloWorld.class</p><p id="0MRABMDT"><strong>3.使用javah生成该类对应的.h文件</strong></p><p id="0MRABMDU">cmd命令:</p><p id="0MRABMDV">命令执行后,生成文件HelloWorld.h</p><p id="0MRABME0">为了简化后续C++工程的配置,这里需要修改HelloWorld.h,将#include</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2022%2F0307%2F4c2ce85cj00r8d0f0000pd200ek00cyg00ek00cy.jpg&thumbnail=660x&quality=80&type=jpg"/><br/></p><p id="0MRABME2"><strong>4.使用C++实现函数功能,编译生成dll</strong></p><p id="0MRABME3">使用Visual Studio,新建一个C++项目Hello,选中win2控制台应用程序, 应用程序类型为DLL,附加选项:导出符号</p><p id="0MRABME4">修改dllmain.cpp或者Hello.cpp均可,具体代码如下:</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2022%2F0307%2F862ec80bj00r8d0f1000ed200cs005og00cs005o.jpg&thumbnail=660x&quality=80&type=jpg"/><br/></p><p id="0MRABME6">项目需要引用以下三个文件:</p><p id="0MRABME7">jni.h,位置为%jdk%includejni.h</p><p id="0MRABME8">jni_md.h,位置为%jdk%includewin32jni_md.h</p><p id="0MRABME9">HelloWorld.h,使用javah生成</p><p id="0MRABMEA">编译生成dll</p><p id="0MRABMEB">注:</p><p id="0MRABMEC">测试环境为64位系统,所以选择生成64位的Hello.dll</p><p id="0MRABMED"><strong>5.通过Java调用dll</strong></p><p id="0MRABMEE">将Hello.dll和HelloWorld.class保存在同级目录,执行命令:</p><p id="0MRABMEF">获得返回结果:</p><p id="0MRABMEG">加载成功</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2022%2F0307%2F37d907dcj00r8d0ey000fd000u0004ug.jpg&thumbnail=660x&quality=80&type=jpg"/><br/>0x04 jsp通过JNI加载dll的方法<br/></p><p id="0MRABMEH">本节将要实现在Tomcat环境下,通过访问jsp文件,执行cmd命令并获得命令执行结果</p><p id="0MRABMEI"><strong>1.编写Java代码,注明要访问的本地动态连接库和本地方法</strong></p><p id="0MRABMEJ">testtomcat_jsp.java:</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2022%2F0307%2F3cf2cea2j00r8d0f2000bd200cd004xg00cd004x.jpg&thumbnail=660x&quality=80&type=jpg"/><br/></p><p id="0MRABMEL">Tomcat环境下,需要以下限制条件:</p><p id="0MRABMEM">固定包名格式为org.apache.jsp</p><p id="0MRABMEN">java文件名称需要固定格式:*_jsp,并且后面的jsp文件名称需要同其保持一致。例如testtomcat_jsp.java,那么最终jsp的文件名称需要命名为testtomcat.jsp</p><p id="0MRABMEO">类名不需要限定为JniClass,可以任意</p><p id="0MRABMEP"><strong>2.编译Java代码得到.class文件</strong></p><p id="0MRABMEQ">cmd命令:</p><p id="0MRABMER">命令执行后,生成文件testtomcat_jsp.class和testtomcat_jsp$JniClass.class</p><p id="0MRABMES"><strong>3.使用javah生成该类对应的.h文件</strong></p><p id="0MRABMET">将testtomcat_jsp$JniClass.class保存在orgapachejsp下</p><p id="0MRABMEU">cmd命令:</p><p id="0MRABMEV">命令执行后,生成文件org_apache_jsp_testtomcat_jsp_JniClass.h</p><p id="0MRABMF0">为了简化后续C++工程的配置,这里需要修改org_apache_jsp_testtomcat_jsp_JniClass.h,将#include</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2022%2F0307%2Fdj00r8d0f30014d200jh00crg00jh00cr.jpg&thumbnail=660x&quality=80&type=jpg"/><br/></p><p id="0MRABMF2"><strong>4.使用C++实现函数功能,编译生成dll</strong></p><p id="0MRABMF3">使用Visual Studio,新建一个C++项目TestTomcat,选中win2控制台应用程序, 应用程序类型为DLL,附加选项:导出符号</p><p id="0MRABMF4">修改dllmain.cpp或者TestTomcat.cpp均可,具体代码如下:</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2022%2F0307%2F74d73e60j00r8d0f30024d200kw00leg00kw00le.jpg&thumbnail=660x&quality=80&type=jpg"/><br/></p><p id="0MRABMF6">注:</p><p id="0MRABMF7">代码JNIEXPORT jstring JNICALL Java_org_apache_jsp_testtomcat_1jsp_00024JniClass_exec(JNIEnv *env, jobject class_object, jstring jstr)需要和头文件中的声明保持一致</p><p id="0MRABMF8">项目需要引用以下三个文件:</p><p id="0MRABMF9">jni.h,位置为%jdk%includejni.h</p><p id="0MRABMFA">jni_md.h,位置为%jdk%includewin32jni_md.h</p><p id="0MRABMFB">org_apache_jsp_testtomcat_jsp_JniClass.h,使用javah生成</p><p id="0MRABMFC">编译生成dll</p><p id="0MRABMFD">注:</p><p id="0MRABMFE">测试环境为64位系统,所以选择生成64位的TestTomcat.dll</p><p id="0MRABMFF"><strong>5.通过jsp调用dll</strong></p><p id="0MRABMFG">向Tomcat上传TestTomcat.dll,在Web目录创建testtomcat.jsp,内容如下:</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2022%2F0307%2Fd78c57f2j00r8d0f4000ud200gm00bvg00gm00bv.jpg&thumbnail=660x&quality=80&type=jpg"/><br/></p><p id="0MRABMFI">注:</p><p id="0MRABMFJ">jsp文件名称需要同之前的java文件保持一致</p><p id="0MRABMFK">访问URL:http://127.0.0.1:8080/testtomcat.jsp?cmd=whoami</p><p id="0MRABMFL">获得命令执行结果,加载成功</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2022%2F0307%2F37d907dcj00r8d0ey000fd000u0004ug.jpg&thumbnail=660x&quality=80&type=jpg"/><br/>0x05 小结<br/></p><p id="0MRABMFM">本文以Tomcat环境为例,介绍通过jsp加载dll的方法,开源代码,记录细节,能够扩展jsp的功能。</p>
讯享网

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/197742.html