2012-05-13 47 views
1

我已經爲java應用程序創建了C++ dll。如果我單獨啓動它,我會在應用程序內部工作,其中包含一個非常冗長的批處理文件,以獲取所有正確的參數。我想嘗試調試我在Visual Studio 2010中創建的dll。我試圖將命令行和參數放入visual studio中的調試屬性頁面。雖然我無法讓應用程序正常啓動。如何爲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

有沒有理由不能在C++中建立一個與dll鏈接並直接測試的虛擬應用程序? –

回答

0

在我的應用程序中,我添加了在啓動時檢查命令行選項的邏輯,並在命令行選項被傳遞給它時調用DebugBreak。

我這樣做是因爲我的應用程序經常被調用到相當複雜的腳本中,並且有時使用正確的環境(路徑,環境變量,臨時文件等)從調試器啓動應用程序非常困難甚至不可能。由腳本設置。

所以,只要調用DebugBreak(請參閱http://msdn.microsoft.com/en-us/library/windows/desktop/ms679297%28v=vs.85%29.aspx)如果一個特定的命令行選項傳遞給您的DLL。

當斷點關閉時,JIT調試器將顯示一個彈出窗口,您可以在其中啓動或附加調試器。

1

我會認真考慮以下幾點:

  1. 如果可能的話,結構JNI,使得在不工作的代碼一無所知JNI。它只接收本機C++的東西作爲參數,並返回本地C++的東西作爲返回值,而不是調用任何JNIEnv函數。
  2. 有一個填充圖層,它具有Java類中本地方法的實際實現。填充層將知道如何調用JNIEnv函數來提取參數,將它們轉換爲本機C++對象並將它們傳遞給工作代碼。同樣,這一層將知道如何將C++對象轉換回Java對象。例如,如果工作者函數返回std::string,那麼墊片層將知道如何調用JNIEnv函數以使本機方法返回Java String回到JVM。

我明白事情不可能總是這樣的結構,但也有一些不錯的優勢吧:

  1. 它可以讓你寫一個C++程序直接驅動工人代碼。這可以使測試代碼的速度更快,更容易,而不必將Java應用程序操縱爲使用代碼的狀態,以便測試。
  2. 您將能夠在調試器,valgrind,內存分析器等下運行您的代碼,而無需在該工具下運行整個JVM。這使得大多數更容易鎖定什麼內存可能泄漏,緩衝區溢出等,而不會陷入由JVM內部操作引起的「噪聲」。

確實,這種方法意味着墊片層沒有被測試。但是由於shim層只是在Java世界和C++世界之間翻譯對象,所以希望它非常簡單,因此可以在完整的Java應用程序環境中進行測試。

+0

如果你把它寫成C++的話,你可以像SWIG那樣自動爲你自動生成所有繁瑣的JNI膠水。 – Flexo