如何用Java調用c++生成的dll文件(1)?

使用Java調用Visual C++生成的dll(動態鏈接庫)文件,實現Java和C++聯合編程。初次學習,重在分享實現步驟和細節,高手勿噴。參考文獻:

工具/原料

JDK

Visual Studio 2010

建立Java工程

首先要安裝好Visual Studio 2010 (其他版本也行)以及JDK(別忘了配置環境變量),然後安裝Eclipse。以上軟件安裝可自行百度,有很多資料。

進入正題,首先在Eclipse中新建工程,File->New->Java Project

如何用Java調用c++生成的dll文件(1)

然後右擊DllTest,New->package,再右擊src目錄下的com包,New->Class。這樣我們的Java項目就建好了。

如何用Java調用c++生成的dll文件(1)

如何用Java調用c++生成的dll文件(1)

再建好的類文件Dlltest.java裡添加代碼。主要是導入dll文件的loadlibrary函數和要調用的函數聲明shanfei。代碼詳見

如何用Java調用c++生成的dll文件(1)

編譯Java工程並生成VC要用到的頭文件

現在打開cmd,先進到當前java文件所在的目錄,用cd xxx\xxx 命令即可,返回上一級目錄用cd..命令(注意後面的倆點)。到當前目錄,也就是com文件夾下,輸入javac Dlltest.java 指令編譯java文件生成Dlltest.class文件,就在com文件夾下。

如何用Java調用c++生成的dll文件(1)

之後再回到上級目錄,就是com文件夾的上一層src目錄(cd..命令),執行javah命令生成頭文件(頭文件DllTest.h就在com的上層文件夾src中),此處一定注意執行javah命令(javah -classpath . -jni com.DllTest,注意點兩邊的空格)的目錄,目錄錯誤就會報錯(如上圖所示)。

建立VC++工程,生成dll文件

打開Visual Studio 2010,新建項目,選擇win32項目

如何用Java調用c++生成的dll文件(1)

下一步,選擇,dll項目,勾選空項目,點擊完成,一個空的dll項目就建好了。

如何用Java調用c++生成的dll文件(1)

還記得之前java項目中生成的DllTest.h文件嗎?它就是Java為C++項目指定的頭文件,java生成頭文件,c++裡只需要將頭文件裡聲明的函數實現就好了。首先把頭文件複製到C++項目的目錄下並導入到解決方案的頭文件目錄下。

如何用Java調用c++生成的dll文件(1)

如何用Java調用c++生成的dll文件(1)

新建一個cpp文件,文件名最好與頭文件一致(不一樣也可以),在這個cpp文件中我們要實現頭文件中的函數,需要注意的是函數頭必須跟DllTest.h中的一樣,不能出錯。加完代碼,會發現包含的頭文件jni.h和jni_md.h出錯了,下一步就來解決它。

如何用Java調用c++生成的dll文件(1)

這個cpp文件中需要包含兩個java安裝目錄下的頭文件:jni.h和jni_md.h,分別位於java安裝目錄下的include文件夾和include裡的win32文件夾內。找到這兩個文件,複製到Visual Studio VC 2010 的頭文件包含目錄中(我的是MicroSoft Visual Studio 10.0\VC\Include,如圖)。當然也可以把頭文件之直接複製到當前項目的目錄下(記得把代碼改為#include “jni.h”),但是這樣每次新建項目都得複製粘貼。

如何用Java調用c++生成的dll文件(1)

如何用Java調用c++生成的dll文件(1)

複製完之後頭文件如果還報錯,就檢查一下VS的包含目錄,確認你把頭文件複製到VS的默認包含目錄中。屬性管理器->Debug->User->通用屬性->VC++目錄->包含目錄(include),添加剛才放置頭文件的目錄即可。

如何用Java調用c++生成的dll文件(1)

如何用Java調用c++生成的dll文件(1)

解決了上述問題,就可以嘗試編譯項目生成dll文件了,在debug或release模式下點擊生成解決方案,生成成功後到項目目錄的debug或release目錄下找到相應的dll文件。

在Java中調用c++生成的dll文件

生成了dll文件,終於到了最後一步。把生成的dll文件複製到Java項目的目錄下,注意不是放在com文件夾,也不是src文件夾,是DllTest文件夾內,跟src同級,否則會報錯。

如何用Java調用c++生成的dll文件(1)

還有一點需要注意的是,在Java文件內用LoadLibrary函數調用的庫名必須與Dll文件名一致,而不是跟java類名一致,這點可以參考java 部分的代碼。確認完上述問題,點擊運行,稍等片刻就可以看到運行結果,java&dll之旅到此結束。

如何用Java調用c++生成的dll文件(1)

相關問題答案