私はついにこれを理解しました!SWIG の Java 型マッピング システムがどのように機能するかを理解するのに少し時間がかかりました (ほとんどの例では、いくつかの重要な概念が省略されています)。
他の人が Java タイプマップの書き方を理解するのに苦労している場合、ここに役立つ方法があります。タイプマップをトップダウンの視点 (つまり、Java -> 中間 JNI -> JNI) から見るのが最も簡単だと判断しました。最初に、jstype
Java クラスで表示するタイプとして を定義します (例: module_name.java)。javain
変数を Java クラスから中間 JNI クラス (例: module_nameJNI.java) に渡す方法を SWIG に伝えるために使用します。次に、 をjtype
同じ型として定義しjavain
ます。たとえば、$javainput.getNativeObjectAddr()
a を返すlong
ので、これは my になりますjtype
。最後に、jni
実際の JNI 関数が使用するものとして定義します。
以下は、OpenCV の Java インターフェイス (2.4.5 時点) 上で実行するために私が思いついた SWIG タイプマップです。
%typemap(jstype) cv::Mat& "org.opencv.core.Mat"
%typemap(javain) cv::Mat& "$javainput.getNativeObjAddr()"
%typemap(jtype) cv::Mat& "long"
%typemap(jni) cv::Mat& "jlong"
%typemap(in) cv::Mat& {
$1 = *(cv::Mat **)&$input;
}
%typemap(jstype) cv::Size& "org.opencv.core.Size"
%typemap(javain) cv::Size& "$javainput"
%typemap(jtype) cv::Size& "org.opencv.core.Size"
%typemap(jni) cv::Size& "jobject"
%typemap(in) cv::Size& {
jclass sizeClass = JCALL1(GetObjectClass, jenv, $input);
jfieldID widthFieldId = JCALL3(GetFieldID, jenv, sizeClass, "width", "D");
jfieldID heightFieldId = JCALL3(GetFieldID, jenv, sizeClass, "height", "D");
double width = JCALL2(GetDoubleField, jenv, $input, widthFieldId);
double height = JCALL2(GetDoubleField, jenv, $input, heightFieldId);
$1 = new cv::Size((int)width, (int)height);
}
%typemap(freearg) cv::Size& {
delete $1;
}