关于JAVA调用dll的学习总结
首先是背景:
1.程序猿小明要使用Java程序來調用IC讀卡器,由于Java沒有相關方法直接調用讀卡器,目前只有C或C++語言能調用讀卡器的驅動來控制讀卡器,因此得先使用C或C++寫完操作函數,封裝成dll的形式供Java調用。但是直接使用C++生成的DLLJava并不能調用,所以得通過jni。
要怎么做呢?
1.第一步不是直接寫dll然后生成dll然后再寫Java類直接調用!!!這跟C++使用動態鏈接庫是有區別的!
2.那第一步不寫DLL那是干嘛呢?那肯定是寫Java類了!首先是規劃好并寫一個Java類,要生成一個Java可以使用的DLL必須由這個Java類來生成。這個Java類這個類負責調用DLL,也就是調用這個類里邊的方法就可以調動讀卡器。特別需要注意的是什么呢,生成的Java的DLL也不像C++的DLL一樣,誰都可以使用,由一個JAVA類生成的DLL只有這個Java類才可以調用這個DLL!
3.至于第二步為什么使用“規劃”這個詞也是以上的原因,因為一旦DLL生成了以后呢,如果到時候你覺得可以調用讀卡器的這個類的包名起的不好、或者說類名取得不好,或者是里邊關于調用讀卡器的方法名取得不好,你想改一改這些名稱,對不起,這個類已經跟DLL綁定在一起了,只有這個類才可以調用DLL,要是這個類有變動,那么它就不能調用這個DLL了!那生成的DLL就廢了,只能重新做另外一個DLL。
4.所以說這個類很重要,那這個類怎么寫呢?既然是一個Java類,那大體還是跟普通的Java類是一致的。如以下:
5.生成類以后那肯定是編譯了,假設該類為ABC.java,使用javac命令把這個類編譯成ABC.class文件。
6.生成ABC.class文件以后,使用javah命令處理這個ABC.class文件,javah也是jdk自帶的工具,也放在jdk的bin目錄下,處理這個ABC.class文件了會生成ABC.h文件。這個ABC.h文件就是生成DLL的關鍵了,接下來的步驟跟使用C++寫DLL就比較像了,注意這個ABC.h文件里邊記載了ABC.java的方法聲明,還有包路徑信息。所以說DLL和這個類綁定在了一起。不能誰都使用。大致如下:
7.接著就是C++編寫動態鏈接庫的方式了,首先通過vs創建一個DLL工程,DLL工程的項目名就是DLL的名了(可以跟ABC不一樣,上面說的好像不一樣也可以,現在把“好像”去掉),頭文件就不用寫了,因為上邊已經生成了ABC.h頭文件,直接引入即可,同時還需要導入兩個頭文件,jin.h和jni_md.h。這兩個文件都在jdk中的include文件夾下,把它們復制到項目中。
8.既然頭文件搞好了,那就開始寫cpp文件了,具體的就跟c++寫函數實現一樣了,就實現在ABC.h中聲明的那些函數即可。也就是操作讀卡器的代碼。
9.寫完后就可以生成了,生成成功后會在DLL底下生成DLL文件,把DLL放在你的JAVA項目下,就可以通過調用ABC.java的方法來操作讀卡器咯。至于放到項目的哪里,應該都可以吧,如果使用eclipse等開發工具,可以配置庫的位置,如果不用任何開發工具,最好放在最外層的包相同等級的文件夾下吧,或者放在jdk的庫里邊,反正到時候運行報錯了會有提示說在xxx;vvv;bbb;找不到庫,只要把這個dll放在這些其中任意一個地方就好了。
純屬個人理解,如有錯誤,歡迎指正!
學習資料來源:
Java通過JNI調用C++的DLL文件
Java調用第三方dll
這是一個完整的小demo
總結
以上是生活随笔為你收集整理的关于JAVA调用dll的学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序包不存在?无源文件?找不到文件?找不
- 下一篇: Java为什么我们现在有时不用环境变量就