代码之家  ›  专栏  ›  技术社区  ›  Steve Townsend

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

  •  7
  • Steve Townsend  · 技术社区  · 15 年前

    我们正在实现一个C++代码包,用于对Java客户端进行曝光。我见过 SWIG documents about exception handling 但是,这三个层(C++/SWIG/Java)中的编码术语是什么呢?

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

    2 回复  |  直到 15 年前
        1
  •  4
  •   wheaties    15 年前

    因为我一直在努力(从我的个人资料中查看我的博客,它是关于python、swig、exceptions和directors的,但应该有所帮助),所以让我给你一些建议:

    1. 不要向Java堆栈发送C++异常。它会破坏你的应用程序。确保它们都以正确的方式包装。我知道你在问这件事,但你必须把这件事告诉我。一个漏掉的例外可以解决所有的问题。
    2. 不要尝试将Java异常传递给C++堆栈,它们会被转换成SigigDistor异常或SigigOracExtExcExpts。这是一个真正的痛苦,因为您对Java异常松散类型信息。相反,如果你不是在处理一个导演,那么创建一个C++类,它只会引发C++异常,这样你就可以在C++堆栈中扩展C++异常。
    3. 在St::String中将所有从Java传递到C++的裸字符串包起来。如果你把它们当作 const char 指针Java将有垃圾回收的选项。所有的项目都是这样,但这是一个很容易被忽视的项目,我已经做了几次,并看到它已经做了几次。

    之后,不要读1.1。使用2.0或1.3中的文档。更清楚的是。

        2
  •  8
  •   Andy Thomas    15 年前

    Java-specific section on exception handling

    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