2012-12-21 18 views
9

के माध्यम से जावा में सी ++ अपवादों को संभालना मैं एक सी ++ कक्षा को जावा क्लास में लपेटने के लिए SWIG का उपयोग करने का प्रयास कर रहा हूं। इस सी ++ कक्षा में एक विधि है जो अपवाद फेंकता है।एसडब्ल्यूआईजी

मैं तीन गोल, जिनमें से कोई भी वर्तमान में हो रही हैं, हालांकि मैं मैनुअल का पालन किया है के रूप में मैं इसे समझ है:

  • विधि है कि सी ++
  • में फेंकता पर throws <exceptiontype> घोषित करने के लिए जावा वर्ग प्राप्त करने के लिए एसडब्ल्यूआईजी उत्पन्न अपवाद वर्ग java.lang.Exception
  • उत्पन्न करने के लिए उत्पन्न एसडब्ल्यूआईजी कक्षा में Exception.getMessage() ओवरराइड करने के लिए।

ऐसा लगता है कि समस्या की जड़ यह प्रतीत होती है कि मेरे typemap एस लागू नहीं किए जा रहे हैं, क्योंकि उपर्युक्त में से कोई भी नहीं होता है। मैंने क्या गल्त किया है?

न्यूनतम उदाहरण नीचे दिया गया है। सी ++ को संकलित करने की आवश्यकता नहीं है, मुझे केवल जेनरेट किए गए जावा में दिलचस्पी है। अपवाद का वर्ग अप्रासंगिक है, और नीचे दिया गया कोड IOException का उपयोग करता है क्योंकि दस्तावेज़ इसका उपयोग करता है। सभी कोड यहाँ उदाहरण से अनुकूलित है:

सी ++ हेडर फाइल (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 घोषणा नहीं करता है।

उत्तर

9

जब आप इसे देखते हैं तो आप खुद को लात मारने जा रहे हैं। आपके एसडब्ल्यूआईजी इंटरफ़ेस का एक निश्चित संस्करण है:

%module TestModule 
%{ 
#include "test.h" 
%} 

%include "std_string.i" // for std::string typemaps 

// 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(); 
    } 
%} 

%include "test.h" 

आईई। %include "test.h" के बाद आता है जो टाइपमैप आप test.h में कक्षाओं पर लागू करना चाहते हैं, पहले नहीं। एसडीआईजी द्वारा टाइप किए जाने वाले वर्गों को पहली बार देखा जाने वाले वर्गों को देखा जाना चाहिए।

+0

कितना अविश्वसनीय रूप से निराशाजनक। धन्यवाद! –