使用SWIG对Java进行类型映射,但仍未捕获

问题描述:

我正在尝试使用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 

好吧,我想通了。当然,这是我的错。出于某种原因,在C++代码中,我决定通过指针抛出异常,即throw new ...,因为SWIG代码期望我通过引用throw ...来抛出异常。改变了这一点,它现在按预期工作。