如何通过SWIG到Java处理C ++中的异常

时间:2010-09-28 00:06:49

标签: java c++ exception-handling java-native-interface swig

我们正在实现C ++代码的包装器,以便暴露给Java客户端。我已经看过SWIG documents about exception handling但是这在三层(C ++ / SWIG / Java)中的编码术语中有什么意义呢?

如果有人有工作实例或建议,我将不胜感激。

2 个答案:

答案 0 :(得分:8)

另请参阅Swig 2.0文档中的Java-specific section on exception handling

为了避免多次编写模式,我创建了一个SWIG宏,支持抛出一种类型的C ++异常的方法 - 通过捕获它并抛出相应的Java异常:

WRAP_THROW_EXCEPTION( myCppDeclaration, com::foo::MyCppExceptionClass, 
  "com.foo.MyException",
  "com/foo/MyException" );

这是宏:

%define WRAP_THROW_EXCEPTION( MATCH, CPPTYPE, JTYPE, JNITYPE )
%javaexception(JTYPE) MATCH {
  try {
    $action
  }
  catch ( CPPTYPE & e ) {
    jclass eclass = jenv->FindClass(JNITYPE);
    if ( eclass ) {
      jenv->ThrowNew( eclass, e.what() );
    }
  }
}
%enddef

答案 1 :(得分:4)

因为我已经和我搏斗了(从我的个人资料中查看我的博客,它是关于python,SWIG,例外和导演但应该有帮助)让我给你一些建议:

  1. 不要将C ++异常发送到Java堆栈。它会使你的应用程序崩溃。确保它们都以正确的方式包裹。我知道你在问这个问题,但是你必须明白这一点。一个错过的例外情况可以解决这个问题。
  2. 不要尝试将Java异常传递给C ++堆栈,它们会转换为SWIGDirectorExceptions或SWIGMethodExceptions。这是一个真正的痛苦,因为您丢失了Java异常的类型信息。相反,如果你不是在处理一个控制器,那么创建一个C ++类,它只会引发C ++异常,这样你就可以在C ++堆栈中传播C ++异常。
  3. 在std :: string中包装从Java传递给C ++的所有裸字符串。如果将它们保留为const char指针,Java将可以选择垃圾收集它们。这对所有项目都是如此,但它是一个容易被忽视的项目,我已经完成了它,已经看过几次了。
  4. 之后,请不要阅读1.1。使用2.0或1.3中的文档。它更清楚。