के माध्यम से जावा में सी ++ अपवादों को संभालना मैं एक सी ++ कक्षा को जावा क्लास में लपेटने के लिए SWIG का उपयोग करने का प्रयास कर रहा हूं। इस सी ++ कक्षा में एक विधि है जो अपवाद फेंकता है।एसडब्ल्यूआईजी
मैं तीन गोल, जिनमें से कोई भी वर्तमान में हो रही हैं, हालांकि मैं मैनुअल का पालन किया है के रूप में मैं इसे समझ है:
- विधि है कि सी ++
- में फेंकता पर
throws <exceptiontype>
घोषित करने के लिए जावा वर्ग प्राप्त करने के लिए एसडब्ल्यूआईजी उत्पन्न अपवाद वर्गjava.lang.Exception
- उत्पन्न करने के लिए उत्पन्न एसडब्ल्यूआईजी कक्षा में
Exception.getMessage()
ओवरराइड करने के लिए।
ऐसा लगता है कि समस्या की जड़ यह प्रतीत होती है कि मेरे typemap
एस लागू नहीं किए जा रहे हैं, क्योंकि उपर्युक्त में से कोई भी नहीं होता है। मैंने क्या गल्त किया है?
न्यूनतम उदाहरण नीचे दिया गया है। सी ++ को संकलित करने की आवश्यकता नहीं है, मुझे केवल जेनरेट किए गए जावा में दिलचस्पी है। अपवाद का वर्ग अप्रासंगिक है, और नीचे दिया गया कोड IOException का उपयोग करता है क्योंकि दस्तावेज़ इसका उपयोग करता है। सभी कोड यहाँ उदाहरण से अनुकूलित है:
- http://www.swig.org/Doc1.3/Java.html#typemap_attributes
- http://www.swig.org/Doc1.3/Java.html#exception_typemap
सी ++ हेडर फाइल (test.h):
#include <string>
class CustomException {
private:
std::string message;
public:
CustomException(const std::string& message) : message(msg) {}
~CustomException() {}
std::string what() {
return message;
}
};
class Test {
public:
Test() {}
~Test() {}
void something() throw(CustomException) {};
};
बड़ा घूँट मैं फ़ाइल:
%module TestModule
%{
#include "test.h"
%}
%include "std_string.i" // for std::string typemaps
%include "test.h"
// Allow C++ exceptions to be handled in Java
%typemap(throws, throws="java.io.IOException") CustomException {
jclass excep = jenv->FindClass("java/io/IOException");
if (excep)
jenv->ThrowNew(excep, $1.what());
return $null;
}
// Force the CustomException Java class to extend java.lang.Exception
%typemap(javabase) CustomException "java.lang.Exception";
// Override getMessage()
%typemap(javacode) CustomException %{
public String getMessage() {
return what();
}
%}
SWIG 2.0.4 के साथ swig -c++ -verbose -java test.i
के साथ इसे चलाने पर, अपवाद वर्ग java.lang.Exception
का विस्तार नहीं करता है और जावा विधियों में से कोई भी throws
घोषणा नहीं करता है।
कितना अविश्वसनीय रूप से निराशाजनक। धन्यवाद! –