Java與C++混合編程(1)

現在的程序員,不再像以前一樣,掌握一種編程語言就可以混得有模有樣了,這裏爲大家講的,就是C++與Java混合編程.

現實的情況是,真實的項目中,通常是涉及多種編程語言,舉幾個簡單的例子,一個軟件爲了快速開發,可能是使用Delphi或VB作爲界面開發首選語言,底層的指令或核心算法,會使用C/C++處理,涉及數據處理的時候,爲了安全和快速開發,會使用Javascript或Python等腳本語言實現數據分析處理。因此,開發者應該學習或掌握語言混合編程。 C++和Java是主流的兩種編程語言,但是現在整個網上對實現這兩種語言混合編程的資料少之又少,卻又說之不全,並且有時多種問題現在也含糊不清,對正在學習或使用這兩種語言的朋友造成很大的困擾。本人的這篇拙作,希望對使用這兩種語言混合編程學習的朋友可以拋磚引玉。

實現原理

實現Java和C++的交互,使用的技術是稱爲JNI( Java Native Interface ),C++編寫的程序,只要實現JNI生成的接口,則可以讓Java程序調用,而Java編寫的程序,C++調用,則需要運行Java虛擬機,通過JNI查詢調用Java實現的方法。

環境變量設置

本文中使用的Java的版本是( build 1.6.0_03-b05 ),C++的版本爲VC++ 6.0版本。並根據你本機上的Java和C++安裝目錄設置以下的環境變量

java

注意不要缺少Java的include和lib這三個紅線標出部分(爲源碼包文件中的cpp-env.Bat這個批處理文件)。

設置Java的環境變量,如下圖所示

java

注意紅線標註的這處部分,這部分與C++調用Java的方法時候影響非常重要(爲源碼包文件中的java-env.Bat這個批處理文件)。 在command模式運行這兩個批處理文件後,就可以在command模式運行demo程序了。

Java調用C++的方法

源碼文件中 %SRC%/Java-cpp目錄中的WinFile.java的這個文件(Java語法規定類名與文件名必須一致),定義了一個WinFile類,這個類的內容如下

java

在代碼的第18行,聲明一個帶native屬性的方法GetFilesFromDir,這個方法傳入一個字符類參數,並返回一個字符類參數,而System.loadLibrary則會加載指定的共享鏈接庫,參數所示加載的動態庫爲libwinfile.dll,在windows平臺上,執行時會自動加入後綴.dll。 在command模式運行以下命令:

java

第一條命令則會生成WinFile.class的編譯文件,而第二條命令則會生成WinFile.h這個頭文件,這個頭文件包含了WinFile.java中的native的方法的C/C++語言的定義。

java

在C/C++的語言定中,Java語言的String的定義爲jstring,注意,Java的語言的字符與程序的編碼都是以UTF-8編碼實現的,所以Java中的中文字符在C++的方法中如果沒有編碼轉換,則會顯示爲亂碼。同理,在C++的方法中將中文字符返回給Java,如果沒有將字符編碼轉爲UTF-8,在Java的方法顯示同樣會是亂碼。

java

以上爲%SRC%/Java-cpp/WinFile.cpp的部分代碼,代碼中實現了兩個函數,一個是將UTF-8轉爲GB2312,另一個爲將GB2312轉爲UTF-8,而jni.h這個頭文件中也同時提供了jstring與char*的類型之間轉換函數。

GetStringUTFChars

NewStringUTF

運行如下編譯命令:

cl -GX -LD WinFile.cpp -FelibWinFile.dll

則生成libWinFile.dll這個動態庫(注意,生成的名稱要與System.loadLibrary這個函數內的參數的名稱一致),運行這個Java的類。

則輸出如下

java 


發佈了1 篇原創文章 · 獲贊 5 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章