2012-05-03 14 views
5

मेरे पास एक डीएलएल है जो एक एन्कोडेड स्ट्रिंग इनपुट लेता है और इसे डीकोड करता है। डीएलएल को कोडब्लॉक्स और मिंगव 64 का उपयोग कर विन 7 64-बिट पर बनाया गया था। सी कोड अकेले ठीक चलता है लेकिन जब मैं इसे एक ही स्ट्रिंग के साथ थोड़ी देर में जेएनए के माध्यम से चलाता हूं तो इसे लगभग 70% कॉल के लिए ठीक से डीकोड किया जाता है और बाकी के लिए यह गलत होता है। मैं स्थिति को डीबग करना चाहता हूं लेकिन मुझे यकीन नहीं है कि जावा कोड के नियंत्रण के बाद जेएनए पर नियंत्रण कैसे किया जाए। वैकल्पिक रूप से कहां देखना है, इस पर कोई भी विचार उपयोगी होगा।जेएनए सी डीएलएल डीबग हाउटो?

सी और 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" यह एन्क्रिप्ट मैं में नहीं जा रही हूँ एन्क्रिप्शन विवरण क्योंकि वे अप्रासंगिक हैं) फिर एन्क्रिप्टेड आउटपुट को इस डीएलएल विधि में पास करें, 10 बार में से 7 बार मुझे "हैलोवर्ल्ड" अन्य 3 बार मिलते हैं, मैं गलत और अलग-अलग अक्षर प्राप्त करूंगा। और सभी 10 बार मैं एक ही थ्रेड में उसी वैरिएबल का उपयोग कर उसी धागे में हूं। 3 गलत घटनाएं भी यादृच्छिक हैं, केवल एक चीज जो मैं देख सकता हूं वह यह है कि पहला रन हमेशा परीक्षण किया जाता है जितना मैंने परीक्षण किया है लेकिन गलत रन किसी भी 1-10 रन में होता है।

+0

[नीचे दिए गए लिंक देखें] (http://web.archive.org/web/20081210024620/http://www.kineteksystems.com/white-papers/mixedjavaandc.html) – user1097489

+0

आप कैसे निर्धारित कर रहे हैं ऑपरेशन की "शुद्धता"? देखने के लिए पहली जगह इनपुट और आउटपुट पर हस्ताक्षरित और हस्ताक्षरित के बीच रूपांतरण त्रुटियों के लिए होगी। – technomage

+0

ध्यान दें कि आपका एपीआई '' एक्सकी 'डेटा के प्रारूप के साथ-साथ '' आउट'' बफर के आकार के बारे में धारणाएं बना रहा है। – technomage

उत्तर

4

डीएलएल प्रोजेक्ट के लिए प्रोजेक्ट सेटिंग्स से, माइक्रोसॉफ्ट विजुअल सी ++ में, आप डीबग टैब का चयन कर सकते हैं। डीबग सत्र के लिए निष्पादन योग्य के रूप में, Java.exe का पूरा पथ प्रदान करें। तर्कों के लिए, अपने जावा ऐप को चलाने के लिए कमांड लाइन का शेष प्रदान करें। अपने सी कोड में ब्रेक पॉइंट सेट करें और डीबग सत्र शुरू करें। देखा!

संबंधित मुद्दे