天天看點

Java采用JNI調用VC++生成的dll(Java與C++互動)

     應項目需求,需要android調用java,java再調用C++實作android一個圖檔比對的功能,我們作為java組需要和C++和Android進行互動。下面是java和C++采用JNI的方式進行接口傳參互動,我做的一個demo并運作成功。

     JNI全拼是Java Native Interface,中文意思為Java本地調用。JNI标準是Java平台的一部分,它允許java和其他語言的代碼進行互動。JNI開始是為了本地已經編譯好的語言,尤其是C和C++而設計的,我們也可以使用JNI和其他語言進行溝通,我們隻要調用約定受支援了就可以了。

     我們知道C++中或者C#等.net都能生成.dll類庫,而C++(或.net)中生成的.dll檔案,相當于我們java程式中java源代碼通過編譯生成的.class檔案,我們在java程式中直接通過code調用C++的dll檔案即可。

     在C語言中如果生成一個動态連結庫dll檔案的時候,需要兩部分,一部分是為.h的頭檔案,這個檔案是負責對一些方法的聲明,而.cpp檔案負責對方法的實作。而在java中,在JDK安裝目錄的include包中有個jni.h和jni_md.h,這個可以說是java釋出的一個接口,在C++中可以直接使用這兩個head類型的檔案對java要調用的C++方法編譯,讓java調用,并可以接收java傳遞過來的參數。直接上代碼啦。

     建立java project,在src下建立com包,在com包下面建立我們的java類Reliability.java,代碼如下所示。

     我們想實作傳遞int 整型參數來實作自己和自己相乘的結果,而實作shanfei(int p)方法的是C++。我們可以通過System.loadLibrary("Reliability")方法實作加載C++生成的dll,通過native聲明方法接口以及參數。 

     編寫好自己的Reliability.java代碼後,可以使用MyEclipse編譯為Reliability.class檔案或者是直接用javac指令編譯為.class檔案。

     我的使用的MyEclipse進行編譯的,會在/Reliability/bin/com檔案夾中生成Reliability.class檔案。

     在這裡需要注意的是,一定要轉到你編譯成class檔案的上一級目錄進行javah指令,并且你的JDK已經配置好環境變量,這裡的環境變量為JAVA_HOME:安裝jdk bin檔案夾的上一級目錄,比如我的jdk安裝在C:\java\bin....,那我的JAVA_HOME為:C:\java 。path目錄:引用JAVA_HOME并且加上\bin

,為 %JAVA_HOME%\bin 。classpath為: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;這是一定要配置好的。然後在dos視窗如下編寫如下指令,生成給C++ .h的檔案。

Java采用JNI調用VC++生成的dll(Java與C++互動)

     這樣在你的class檔案上一級目錄中就會出現.h 的檔案,并且引入到你的MyEclipse中,與com包同級。

Java采用JNI調用VC++生成的dll(Java與C++互動)

     因為要生成dll檔案,是以我們需要建立動态連結庫檔案,如果用的是C++ 6.0環境,就是建立projects --Dynamic-LInk Library工程。

之後添加我們的com_Reliability.h檔案到我們的DLL項目中,目錄結構如下所示。

Java采用JNI調用VC++生成的dll(Java與C++互動)

     頭檔案中的代碼如下所示,com_Reliability.h。

     實作的Reliability.cpp代碼如下所示。

     切忌:.cpp中和.h中的方法名一定要相同!!!并且把從java中找到的jni.h 和jni_md.h粘貼到外部依賴檔案夾,或者直接放到VC98\include檔案夾中。

     這樣我們ctrl+F7編譯,F7在C++項目的debug中生成Reliability.dll檔案,這樣我們再把這個dll檔案放到java編譯的.class目錄,同時放到MyEclipse與src同級。這樣運作java的Reliability.java檔案,就看到C++給我們計算的結果了。顯示如下所示。

Java采用JNI調用VC++生成的dll(Java與C++互動)

     上述大緻就是這個過程,在這個過程中會出現這樣或者那樣的問題,我也在不斷的去嘗試錯誤的所在,嘗試改動,最根本的就是計算機報錯了,就一定是自己哪個地方有錯誤,抱着這樣的心态,耐心的找答案、嘗試、思考,設定斷點調試,看到底是哪步出現的錯誤,最終會解決問題,讓你興奮的看到運作結果。

繼續閱讀