9

SWIGを使用してC++クラスをJavaクラスにラップしようとしています。このC++クラスには、例外をスローするメソッドがあります。

私には3つの目標がありますが、私はそれを理解しているので、マニュアルに従いましたが、現在はどれも達成されていません。

  • throws <exceptiontype>C++でスローするメソッドで宣言するJavaクラスを取得するには
  • SWIGで生成されたExceptionクラスを拡張するにはjava.lang.Exception
  • Exception.getMessage()生成されたSWIGクラスでオーバーライドします。

上記のいずれも起こらないので、問題の根本は私typemapのが適用されていないようです。私は何を間違えましたか?

最小限の例を以下に示します。C ++はコンパイルする必要はなく、生成されたJavaにのみ関心があります。例外のクラスは無関係であり、以下のコードは、ドキュメントでIOExceptionが使用されているという理由だけでIOExceptionを使用しています。すべてのコードは、次の例を基にしています。

C ++ヘッダーファイル(test.h):

#include <string>

class CustomException {
private:
  std::string message;
public:
  CustomException(const std::string& message) : message(msg) {}
  ~CustomException() {}
  std::string what() {
    return message;
  }
};

class Test {
public:
  Test() {}
  ~Test() {}
  void something() throw(CustomException) {};
};

SWIG .iファイル:

%module TestModule
%{
#include "test.h"
%}

%include "std_string.i" // for std::string typemaps
%include "test.h"

// Allow C++ exceptions to be handled in Java
%typemap(throws, throws="java.io.IOException") CustomException {
  jclass excep = jenv->FindClass("java/io/IOException");
  if (excep)
    jenv->ThrowNew(excep, $1.what());
  return $null;
}

// Force the CustomException Java class to extend java.lang.Exception
%typemap(javabase) CustomException "java.lang.Exception";

// Override getMessage()
%typemap(javacode) CustomException %{
  public String getMessage() {
    return what();
  }
%}

swig -c++ -verbose -java test.iSWIG 2.0.4でこれを実行すると、例外クラスは拡張されず、どのjava.lang.ExceptionJavaメソッドにもthrows宣言がありません。

4

1 に答える 1

10

あなたがこれを見るとき、あなたはあなた自身を蹴るつもりです。SWIGインターフェイスの修正バージョンは次のとおりです。

%module TestModule
%{
#include "test.h"
%}

%include "std_string.i" // for std::string typemaps

// Allow C++ exceptions to be handled in Java
%typemap(throws, throws="java.io.IOException") CustomException {
  jclass excep = jenv->FindClass("java/io/IOException");
  if (excep)
    jenv->ThrowNew(excep, $1.what());
  return $null;
}

// Force the CustomException Java class to extend java.lang.Exception
%typemap(javabase) CustomException "java.lang.Exception";

// Override getMessage()
%typemap(javacode) CustomException %{
  public String getMessage() {
    return what();
  }
%}

%include "test.h"

つまり、 test.hのクラスに適用するタイプマップの前ではなく、%include "test.h"の方になります。タイプマップは、それらが適用されるクラスが最初に表示されるときにSWIGによって表示されている必要があります。

于 2012-12-23T11:43:18.833 に答える