2011-08-29 17 views
6

मैं अपवाद JNA के तहत पुस्तकालयों द्वारा फेंके जाने के साथ काम कर के बारे में एक त्वरित सवाल ...JNA पकड़ने अपवाद

जब मैं अंतर्निहित मूल कोड में एक अपवाद फेंक, JNA एक अवैध स्मृति पहुँच त्रुटि हो जाता है। मुझे लगता है कि ऐसा इसलिए है क्योंकि सी पुस्तकालय इसके ढेर के माध्यम से अपवाद नहीं फेंक सकते हैं (यह वास्तव में सी ++/सीएलआर है लेकिन सी निर्यात है)? तो जावा के अपवाद की रिपोर्ट करने का कोई वास्तविक तरीका नहीं है? या "यह काम करना चाहिए" और मैं बस कुछ अविश्वसनीय रूप से गलत कर रहा हूँ?

DllExport void Initialize(char* dir) 
{ 
    throw gcnew System::Exception("Testing"); 
} 

यह अच्छा होगा जावा इन फेंका अपवाद पता लगाने में सक्षम होने के लिए, और मुझे लगता है कि मैं वास्तव में मेरे सारे सी निर्यात में स्मृति सूचक गुजर गौर और अगर उन अशक्त या नहीं कर रहे हैं देखने के लिए जाँच कर सकता है, लेकिन एक चौराहे के रास्ते की तरह लगता है।

उत्तर

4

आपको स्वयं को C++ अपवाद को संभालने की आवश्यकता है और इसके बजाय एक जावा अपवाद बनाना है जिसे कोड के जावा पक्ष में पारित किया जा सकता है।

+0

तो मैं इसे सी ++/सीएलआर पक्ष पर पकड़ूंगा, और इसे कई पैरामीटर के रूप में जावा में वापस भेज दूंगा? (या सरल त्रुटि रिपोर्टिंग की इच्छा के उदाहरण में, केवल दूसरा पैरामीटर होने पर, "char * err" पर्याप्त होगा)। मैंने सोचा कि मुझे शायद ऐसा करना होगा। – StrangeWill

4

सी ++ अपवाद केवल सी ++ कोड में ही संभाले जा सकते हैं। उन्हें सी ++ दुनिया से बचने की अनुमति नहीं दी जानी चाहिए (यानी, सी ++ कोड के सी इंटरफ़ेस को अपवादों को प्रचारित नहीं करना चाहिए)। सी ++ अपवाद को दो सी ++ मॉड्यूल के बीच सी कोड की एक परत के माध्यम से प्रसारित करने के लिए भी सुरक्षित नहीं है (उदाहरण के लिए, जब एक सी ++ फ़ंक्शन एक सी फ़ंक्शन को कॉल करता है जो बदले में सी ++ फ़ंक्शन को कॉल करता है)।

इसके कारणों में से एक यह है कि सी ++ अपवादों को कैसे कार्यान्वित किया जाना चाहिए, इस पर कोई मानक नहीं है, इसलिए सी ++ मॉड्यूल केवल उसी कंपाइलर (उसी संस्करण में) द्वारा संकलित किए जाने पर बाइनरी-संगत होते हैं। तो सी ++ अपवादों को संभालने के लिए किसी भी अन्य भाषा में कोड स्थापित नहीं किया जा सकता है।

इस मामले में (सी ++ पुस्तकालय, सी इंटरफ़ेस, जावा से कहा जाता है) आप, C++ अपवाद को पकड़ने के लिए है सी इंटरफेस के माध्यम से जानकारी का प्रचार (जैसे, त्रुटि वापसी कोड का उपयोग करके), जावा में इसके लिए जाँच करेगा और वहां एक अपवाद फेंक दो।

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