0x00 前言Java可以通過JNI接口訪問本地的動態連接庫,從而擴展Java的功能。本文將以Tomcat環境為例,介紹通過jsp加載dll的方法,開源代碼,記錄細節。
0x01 簡介本文將要介紹以下內容:
基礎知識
Java通過JNI加載dll的方法
jsp通過JNI加載dll的方法
0x02 基礎知識JNI,全稱Java Native Interface,是Java語言的本地編程接口。可以用來調用dll文件
調用JNI接口的步驟:
1、編寫Java代碼,註明要訪問的本地動態連接庫和本地方法
2、編譯Java代碼得到.class文件
3、使用javah生成該類對應的.h文件
4、使用C++實現函數功能,編譯生成dll
5、通過Java調用dll
0x03 Java通過JNI加載dll的方法本節將要實現通過Java加載dll,在命令行輸出'Hello World'
1.編寫Java代碼,註明要訪問的本地動態連接庫和本地方法HelloWorld.java:
注:
也可以使用System.load指定加載dll的絕對路徑,代碼示例:System.load('c:\\test\\Hello.dll');
上述代碼註明了要訪問本地的Hello.dll,調用本地方法print()
2.編譯Java代碼得到.class文件cmd命令:
命令執行後,生成文件HelloWorld.class
3.使用javah生成該類對應的.h文件cmd命令:
命令執行後,生成文件HelloWorld.h
為了簡化後續C++工程的配置,這裡需要修改HelloWorld.h,將#include
4.使用C++實現函數功能,編譯生成dll使用Visual Studio,新建一個C++項目Hello,選中win2控制台應用程序, 應用程序類型為DLL,附加選項:導出符號
修改dllmain.cpp或者Hello.cpp均可,具體代碼如下:
項目需要引用以下三個文件:
jni.h,位置為%jdk%\include\jni.h
jni_md.h,位置為%jdk%\include\win32\jni_md.h
HelloWorld.h,使用javah生成
編譯生成dll
注:
測試環境為64位系統,所以選擇生成64位的Hello.dll
5.通過Java調用dll將Hello.dll和HelloWorld.class保存在同級目錄,執行命令:
獲得返回結果:
加載成功
0x04 jsp通過JNI加載dll的方法本節將要實現在Tomcat環境下,通過訪問jsp文件,執行cmd命令並獲得命令執行結果
1.編寫Java代碼,註明要訪問的本地動態連接庫和本地方法testtomcat_jsp.java:
Tomcat環境下,需要以下限制條件:
固定包名格式為org.apache.jsp
java文件名稱需要固定格式:***_jsp,並且後面的jsp文件名稱需要同其保持一致。例如testtomcat_jsp.java,那麼最終jsp的文件名稱需要命名為testtomcat.jsp
類名不需要限定為JniClass,可以任意
2.編譯Java代碼得到.class文件cmd命令:
命令執行後,生成文件testtomcat_jsp.class和testtomcat_jsp$JniClass.class
3.使用javah生成該類對應的.h文件將testtomcat_jsp$JniClass.class保存在\org\apache\jsp\下
cmd命令:
命令執行後,生成文件org_apache_jsp_testtomcat_jsp_JniClass.h
為了簡化後續C++工程的配置,這裡需要修改org_apache_jsp_testtomcat_jsp_JniClass.h,將#include
4.使用C++實現函數功能,編譯生成dll使用Visual Studio,新建一個C++項目TestTomcat,選中win2控制台應用程序, 應用程序類型為DLL,附加選項:導出符號
修改dllmain.cpp或者TestTomcat.cpp均可,具體代碼如下:
注:
代碼JNIEXPORT jstring JNICALL Java_org_apache_jsp_testtomcat_1jsp_00024JniClass_exec(JNIEnv *env, jobject class_object, jstring jstr)需要和頭文件中的聲明保持一致
項目需要引用以下三個文件:
jni.h,位置為%jdk%\include\jni.h
jni_md.h,位置為%jdk%\include\win32\jni_md.h
org_apache_jsp_testtomcat_jsp_JniClass.h,使用javah生成
編譯生成dll
注:
測試環境為64位系統,所以選擇生成64位的TestTomcat.dll
5.通過jsp調用dll向Tomcat上傳TestTomcat.dll,在Web目錄創建testtomcat.jsp,內容如下:
注:
jsp文件名稱需要同之前的java文件保持一致
訪問URL:http://127.0.0.1:8080/testtomcat.jsp?cmd=whoami
獲得命令執行結果,加載成功
0x05 小結本文以Tomcat環境為例,介紹通過jsp加載dll的方法,開源代碼,記錄細節,能夠擴展jsp的功能。