C++とJavaのハイブリッドプログラミングについて


今のプログラマーは、以前のようにプログラミング言語を身につけるとうまく混ざることができません.ここでは、C++とJavaのハイブリッドプログラミングについてお話しします.
現実的な情況は、真実なプロジェクトの中で、通常は多種のプログラミング言語に関連して、いくつかの簡単な例を挙げて、1つのソフトウェアは急速に開発するため、DelphiあるいはVBをインタフェースの開発の第一選択言語として使うかもしれなくて、下層の指令あるいは核心のアルゴリズム、C/C++の処理を使うことができて、データの処理に関連する時、安全と迅速な開発のため、JavascriptやPythonなどのスクリプト言語を使用してデータ分析処理を行います.そのため、開発者は言語ハイブリッドプログラミングを学ぶか、身につけなければならない.C++とJavaは主流の2つのプログラミング言語ですが、今ではネット全体がこの2つの言語の混合プログラミングを実現する資料が少ないのに、不完全だと言っています.また、多くの問題が今もあいまいで、この2つの言語を勉強している友达や使っている友达に大きな悩みをもたらしています.私のこの拙作は、この2つの言語を混合してプログラミングを勉強している友达にレンガを投げて玉を引くことを望んでいます.
実装の原理
JavaとC++のインタラクションを実現するには、JNI(Java Native Interface)と呼ばれ、C++で作成されたプログラムは、JNIで生成されたインタフェースを実現すればJavaプログラムを呼び出すことができ、Javaで作成されたプログラム、C++で呼び出されると、Java仮想マシンを実行し、JNIクエリーでJavaを呼び出す方法が必要となる.
環境変数の設定
本明細書で使用するJavaのバージョンは(build 1.6.0_03-b 05)、C++のバージョンはVC++6.0です.あなたの本体のJavaとC++インストールディレクトリに基づいて以下の環境変数を設定します.
Javaのincludeとlibの3つの赤い線の表示部分(ソースパッケージファイルのcpp-env.Batというバッチファイル)が欠けていないことに注意してください.
Javaの環境変数を次の図のように設定します.
赤い線の表記のこの部分に注意してください.この部分はC++がJavaを呼び出す方法と非常に重要です(ソースパッケージファイルのjava-env.Batというバッチファイルです).この2つのバッチファイルをcommandモードで実行すると、commandモードでdemoプログラムを実行できます.
JavaがC++を呼び出す方法
ソースファイル
%SRC%/Java-cppディレクトリのWinFile.javaのこのファイル(Java構文ではクラス名とファイル名が一致しなければならない)は、次のようなWinFileクラスを定義します.
コードの18行目にnative属性を持つメソッドGetFilesFromDirを宣言します.このメソッドは文字クラスパラメータを入力し、文字クラスパラメータを返します.System.loadLibraryは指定した共有リンクライブラリをロードします.パラメータに示されているロードされたダイナミックライブラリはlibwinfile.dllです.windowsプラットフォームでは、実行時に自動的に接尾辞.dllが追加されます.commandモードで次のコマンドを実行します.
1番目のコマンドはWinFile.classのコンパイルファイルを生成し、2番目のコマンドはWinFile.hというヘッダファイルを生成します.このヘッダファイルにはWinFile.javaのnativeのメソッドのC/C++言語の定義が含まれています.
C/C++の言語定では、Java言語のStringの定義はjstringとなっていますが、Javaの言語の文字とプログラムの符号化はUTF-8符号化で実現されているので、Javaの中国語文字はC++の方法で符号化変換がなければ乱符号化として表示されます.同様に、C++のメソッドでは中国語文字をJavaに返し、文字コードをUTF-8に変換しなければ、Javaのメソッドでは同様に文字化けして表示されます.
以上
%SRC%/Java-cpp/WinFile.cppの一部のコードでは、UTF-8をGB 2312に、GB 2312をUTF-8に、jni.hというヘッダファイルにjstringとchar*のタイプ間の変換関数が同時に提供される2つの関数が実装されています.
GetStringUTFChars 
NewStringUTF 

次のコンパイルコマンドを実行します.
cl -GX -LD WinFile.cpp -FelibWinFile.dll 

libWinFile.dllというダイナミックライブラリを生成し(生成された名前はSystem.loadLibraryという関数内のパラメータの名前と一致することに注意)、このJavaのクラスを実行します.
出力は次のようになります.
C++Javaクラスメソッドの呼び出し
ここではStringをパラメータの呼び出しとして返す方法を示し,他のタイプのメソッド呼び出しも同様である.
静的宣言を作成するJavaメソッド
このメソッドは、C++の入力された文字パラメータを受け入れ、Javaの文字クラスを返し、C++関数にコンテンツを出力させます.コードは
%SRC%/cpp-java/WinFile.java
このファイルをコンパイルした後に生成するのはjavaバイトコードのファイルで、それは必ずJVMの上で運ばなければならなくて、C++はこれらのJavaバイトコードを持つために、必ずJVMを実行しなければならなくて、JVMのコードを実行してファイルに位置します
%SRC%/cpp-java/WinFile.cppで、下図のように
JNI経由CreateJavaJVMという関数では、C++はJVMを実行します.生成されたWinFile.exeというファイルプロンプトにはjvm.dllが必要ですが、jvm.dllをjreというディレクトリからWinFile.exeというディレクトリにコピーしないでください.jvmが正常に動作するため、jreのjavaライブラリとその動的ライブラリに依存する必要があります.dependencyからはjvm.dllがjreの他のライブラリとファイルに依存していることはわかりませんが.jvm.dllを抜き出してWinFile.exeと同じディレクトリにいれば、実行できますが、JNI_CreateJavaJVM呼び出しは常に失敗します.解決策は、jvm.dllというダイナミックライブラリを上のバッチファイルに示すように検索パスに追加することです.
Java仮想マシンの構築に成功すると、クラス名を動的に取得し、クラス名と関数署名でJavaを取得する方法が必要になります.関数署名を取得する方法は、次のコマンドを実行します.
Java -s -p WinFile 

Javaファイルで定義した関数の署名が出力されます.
あとは文字のパラメータを符号化呼び出し、以下のアイコンに注意すべき点を注記することです.
パラメータの変換プロセスはchar*からUTF 8符号化に移行してjstring偉入javaメソッドに移行し、javaメソッドの戻り値もjstringタイプに移行し、char*タイプに移行してGB 2312に移行する必要があります.プログラムを実行し、出力結果は以下の通りです.
まとめ
ハイブリッド言語プログラミングでは,符号化伝送,言語実行環境の要因に注意する.たとえば、C++でJavaの実行環境を構築します.ハイブリッド言語のプログラミングは難しいですが、面白くて、両方の言語の長所が得られるので、いいことではないでしょうか.