使用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 ...
来抛出异常。改变了这一点,它现在按预期工作。