2012-05-13 29 views
1

JavaアプリケーションのC++ DLLを作成しました。別々に起動すると、アプリケーション内でdllを処理できます。これには、すべての正しい引数を取得するために非常に長いバッチファイルが含まれています。私はVisual Studio 2010で作成したDLLをデバッグしようと思います。Visual Studioのデバッグプロパティページにコマンドラインと引数を入れてみました。私はアプリケーションを正しく起動することができませんが。アプリケーションを起動するためのコマンドラインアプリケーションがのApplicationNameであると仮定すると、このようになりますJavaアプリケーションのC++ DLLのデバッグ方法

...

start "ApplicationName" "C:\AppDirectory\jre\bin\javaw" -D sun.java2d.nodraw=true -Xms24m -Xmx128m -classpath "C:\AppDirectory\classes\;C:\AppDirectory\classes\iText.jar" ApplicationName 

どのようにプロパティ設定に上の任意のアイデアこのため、デバッグの設定? これについてのドキュメントがどこにあるのでしょうか?

+2

DLLにリンクして直接テストするC++でダミーのアプリケーションを構築できない理由はありますか? –

答えて

0

私のアプリケーションでは、起動時にコマンドラインオプションをチェックし、コマンドラインオプションが渡された場合はDebugBreakを呼び出すロジックを追加しました。

私のアプリケーションは非常に複雑なスクリプトで呼ばれることが多く、正しい環境(パス、環境変数、一時ファイルなど)でデバッガからアプリケーションを起動することが非常に難しく、スクリプトによって設定されます。

したがって、特定のコマンドラインオプションがDLLに渡された場合は、DebugBreak(http://msdn.microsoft.com/en-us/library/windows/desktop/ms679297%28v=vs.85%29.aspxを参照)を呼び出します。

ブレークポイントがオフになると、JITデバッガにポップアップが表示され、デバッガを起動または接続できます。

1

私は強く次の点を考慮します:

  1. 可能であれば、構造を作業を行うコードは、JNIについて何も知らないことをJNIは、このような。ネイティブのC++のものだけを引数として受け取ってネイティブのC++のものを戻り値として返し、JNIEnv関数を呼び出さないようにします。
  2. Javaクラスにネイティブメソッドの実際の実装を持つシムレイヤを用意しました。シム層は、JNIEnv関数を呼び出してパラメータを抽出し、それらをネイティブのC++オブジェクトに変換し、それらを動作コードに渡す方法を知っています。同様に、この層はC++オブジェクトをJavaオブジェクトに戻す方法も知っています。たとえば、ワーカー関数がstd::stringを返した場合、シム層はJNIEnv関数を呼び出す方法を知り、ネイティブメソッドがJava StringをJVMに返すようにします。

私は物事は常にこのように構成することはできませんが、いくつかの素晴らしい利点がそれにあることを理解:

  1. それはあなたが直接労働者のコードを駆動するためのC++プログラムを書くことができます。これにより、Javaアプリケーションをテストしたいコードを使用している状態にする必要がなく、コードをテストするのがずっと迅速かつ簡単になります。
  2. ツールの下でJVM全体を実行することなく、デバッガ、valgrind、メモリプロファイラなどでコードを実行することができます。これにより、は、JVMの内部操作に起因する「ノイズ」に陥ることなく、どのメモリがリークされる可能性があるか、バッファオーバーランなどを簡単に突き止めることが容易になります。

このアプローチは、シム層がテストされていないことを意味します。しかし、シム層はJava世界とC++世界の間でオブジェクトを翻訳するだけなので、うまくいくと非常に単純なので、完全なJavaアプリケーションのコンテキストでテストすることができます。

+0

あなたがC++として丁寧に書いているのなら、SWIGがすべての退屈なJNI接着剤を自動的に生成するようなものを作ることができます。 – Flexo

関連する問題