2012-05-03 159 views
5

我有一個需要編碼的字符串輸入並解碼它的DLL。該DLL是使用Codeblocks和mingw64在Win7 64位上製作的。單獨的C代碼運行良好,但是當我通過JNA在同一個循環中使用相同的字符串運行它時,它可以正確解碼大約70%的呼叫,其餘的不正確。我想調試這種情況,但是我不確定在Java代碼將控制權移交給JNA之後如何去做。或者,任何關於在哪裏尋找的想法也會有所幫助。JNA C DLL調試指南?

在C和JNA的方法簽名如下,

Java: int Decrypt_Blk(byte[] expkey, byte[] in, int size, byte[] out); 
C: __declspec (dllexport) int Decrypt_Blk (unsigned char *expkey, unsigned char *in, unsigned int insize, unsigned char *out); 

正確性通過輸出來確定,例如,如果我走串的「HelloWorld」對其進行加密(我不打算進加密細節,因爲它們是無關緊要的),然後將加密輸出傳遞給這個DLL方法,10次中的7次我得到其他3次「HelloWorld」,我會得到不正確和不同的字符。對於所有10次,我都在同一個線程中使用相同的變量。 3次不正確的發生也是隨機的,唯一我能注意到的是第一次運行總是正確多次,但是不正確的運行發生在1-10次運行中的任何一次。

+0

[檢查底部的鏈接](http://web.archive.org/web/20081210024620/http://www.kineteksystems.com/white-papers/mixedjavaandc.html) – user1097489

+0

你是如何確定操作的「正確性」?首先要看的是輸入和輸出中無符號和有符號之間的轉換錯誤。 – technomage

+0

請注意,您的API正在假設「expkey」數據的格式以及「out」緩衝區的大小。 – technomage

回答

4

在Microsoft Visual C++中,從DLL項目的Project Settings中,可以選擇Debug選項卡。作爲調試會話的可執行文件,請提供Java.exe的完整路徑。對於參數,提供命令行的其餘部分來運行Java應用程序。在C代碼中設置斷點並啓動調試會話。瞧!