如何处理来自C++;通过SWIG到Java 我们正在实现一个C++代码包,用于暴露java客户端。我已经看到了,但是这在三个层(C++/SWIG/Java)的编码术语中转换成了什么

如何处理来自C++;通过SWIG到Java 我们正在实现一个C++代码包,用于暴露java客户端。我已经看到了,但是这在三个层(C++/SWIG/Java)的编码术语中转换成了什么,java,c++,exception-handling,java-native-interface,swig,Java,C++,Exception Handling,Java Native Interface,Swig,如果有人有工作示例或建议,我将不胜感激。既然我已经努力解决了这个问题(从我的个人资料中查看我的博客,它是关于python、SWIG、exceptions和directors的,但应该会有所帮助),让我给你一些建议: 不要向C++堆栈发送java异常。它会使你的应用程序崩溃。确保它们都以正确的方式包装。我知道你在问这件事,但你必须把它弄进去。一个遗漏的异常可以将其全部排除 不要尝试将java异常传递到C++堆栈,它们会转换为SigigDistRoad异常或SigigOraceExpExcts。这真

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

既然我已经努力解决了这个问题(从我的个人资料中查看我的博客,它是关于python、SWIG、exceptions和directors的,但应该会有所帮助),让我给你一些建议:

不要向C++堆栈发送java异常。它会使你的应用程序崩溃。确保它们都以正确的方式包装。我知道你在问这件事,但你必须把它弄进去。一个遗漏的异常可以将其全部排除 <>不要尝试将java异常传递到C++堆栈,它们会转换为SigigDistRoad异常或SigigOraceExpExcts。这真的很痛苦,因为您在Java异常上丢失了类型信息。相反,如果你不是在处理一个导演,那么创建一个C++类,它只不过是在C++中添加异常,这样你就可以在C++栈中扩展C++异常。 将一个从java中传递到C++的所有裸露字符串包在STD::String中。如果将它们保留为
constchar
指针,Java将可以选择对它们进行垃圾收集。这是真实的所有项目,但它是如此容易被忽视的一个,我已经做了,并看到它做了几次了
之后,不要阅读1.1。使用2.0或1.3中的文档。更清楚。

另请参见Swig 2.0文档中的本节

<>避免创建一次以上的模式,我创建了一个支持一种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

我非常感谢您的详细反馈。你显然是这个话题的全球专家,恭喜你。@Steve Townsend哈哈,不!我刚刚将SWIG与Python和Java结合使用。我还碰巧写下了我与他人的经历,这样他们就可以受益/分享我的痛苦。不客气!我知道你的问题已经提了几个月了,但我想为未来的读者补充一下。