0

SWIG を使用して C++ コードを Java にラップしようとしています。コードは一般的に機能します。現在、エラー処理に取り組んでいます。C++ コードは、2 種類の例外をスローします。すべての C++ コードを調べて、関数の見出しに throw(...) を追加し、これを SWIG .i ファイルに追加しました。

%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
4

1 に答える 1

0

OK、私はこれを理解しました。もちろん、それは私のせいでした。C++ コードの何らかの理由で、ポインターを介して例外をスローすることにしました。つまり、SWIG コードが期待していたようにthrow new ...参照によってスローする必要があった場合です。throw ...それを変更し、期待どおりに機能するようになりました。

于 2013-05-07T23:18:12.450 に答える