SWIGを使用してC++クラスをJavaクラスにラップしようとしています。このC++クラスには、例外をスローするメソッドがあります。
私には3つの目標がありますが、私はそれを理解しているので、マニュアルに従いましたが、現在はどれも達成されていません。
throws <exceptiontype>
C++でスローするメソッドで宣言するJavaクラスを取得するには- SWIGで生成されたExceptionクラスを拡張するには
java.lang.Exception
Exception.getMessage()
生成されたSWIGクラスでオーバーライドします。
上記のいずれも起こらないので、問題の根本は私typemap
のが適用されていないようです。私は何を間違えましたか?
最小限の例を以下に示します。C ++はコンパイルする必要はなく、生成されたJavaにのみ関心があります。例外のクラスは無関係であり、以下のコードは、ドキュメントでIOExceptionが使用されているという理由だけでIOExceptionを使用しています。すべてのコードは、次の例を基にしています。
- http://www.swig.org/Doc1.3/Java.html#typemap_attributes
- http://www.swig.org/Doc1.3/Java.html#exception_typemap
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.i
SWIG 2.0.4でこれを実行すると、例外クラスは拡張されず、どのjava.lang.Exception
Javaメソッドにもthrows
宣言がありません。