2013-05-07 58 views
0

我正在嘗試使用SWIG將一些C++代碼包裝到java中。代碼一般工作,現在我正在處理錯誤。 C++代碼拋出了幾種類型的異常。我已經通過所有的C++代碼,增加了擲(...)去功能標題,並添加這個我痛飲.i文件:使用SWIG對Java進行類型映射,但仍未捕獲

%include "exception.i" 
%typemap(throws, throws="java.io.IOException") std::ios_base::failure { 
    jclass excep = jenv->FindClass("java/io/IOException"); 
    if (excep) 
    jenv->ThrowNew(excep, $1.what()); 
    return $null; 
} 
%typemap(javabase) std::ios_base::failure "java.lang.Exception"; 
%typemap(throws, throws="java.lang.IllegalArgumentException") std::invalid_argument { 
    jclass excep = jenv->FindClass("java/lang/IllegalArgumentException"); 
    if (excep) 
    jenv->ThrowNew(excep, $1.what()); 
    return $null; 
} 
%typemap(javabase) std::invalid_argument "java.lang.Exception"; 

當我查看生成的Java文件,它們都似乎做得正確,即應該在java中引發異常的函數被指定爲throws ...但是,當我運行代碼並執行在C++端生成異常的命令時,它不會被捕獲包裝和我得到:

libc++abi.dylib: terminate called throwing an exception 
Abort trap: 6 

回答

0

好吧,我想通了。當然,這是我的錯。出於某種原因,在C++代碼中,我決定通過指針拋出異常,即throw new ...,因爲SWIG代碼期望我通過引用throw ...來拋出異常。改變了這一點,它現在按預期工作。