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

 2023-01-20    353  

问题描述

我们正在对C ++代码进行包装,以接触Java客户端.我已经看过 swig关于异常处理的文档但是这是什么在三层(C ++/swig/java)中以编码术语转换?

如果有人有工作示例或建议,我会很感激.

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

推荐答案

由于我已经对此进行了努力(请参阅我的个人资料中的博客,在Python,Swig,例外和董事上,但应该有所帮助),让我给您一些建议:

  1. 不要将C ++异常发送到Java堆栈.它会崩溃您的应用程序.确保它们都以正确的方式包裹.我知道您在问这个问题,但您确实必须知道.一个错过的例外可以软管.
  2. 不要尝试将Java异常传递到C ++堆栈,它们会转换为swigdirectorexceptions或swigmethodexceptions.这是一个真正的痛苦,因为您会放松有关Java异常的信息.相反,如果您不与导演打交道,请创建一个C ++类,该类无非是提高C ++例外,以便您可以沿C ++堆栈偶发出来.
  3. 将所有裸弦包裹在std :: string中从Java传递到C ++.如果您将它们保留为const char指针,Java将可以选择垃圾收集它们.所有项目都是如此,但是它很容易被忽略,我已经完成了它并已经完成了几次.

之后,不要阅读1.1.使用2.0或1.3的文档.更清楚.

其他推荐答案

另请参见SWIG 2.0文档中此异常处理.

为了避免不止一次编写模式,我创建了一个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

以上所述是小编给大家介绍的如何处理从C ++通过SWIG到Java的异常,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/25914.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。