java.awt.Component
として拡張メソッドにパススルーするには、いくつかのタイプマップが必要ですjobject
。
%module test
%typemap(jstype) jobject *awtcomponent "java.awt.Component";
%typemap(jtype) jobject *awtcomponent "java.awt.Component";
%typemap(jni) jobject *awtcomponent "jobject";
%typemap(javain) jobject *awtcomponent "$javainput";
%extend A {
void attach(jobject awtcomponent) {
// Call whatever JNI functions you want with this jobject
// (which is always an AWT component)
// Then:
$self->Attach(arg1, arg2);
}
}
%inline %{
struct A {
};
%}
メンバー関数が既にある場合は、実際には%extend
完全にスキップして typemap を使用して直接処理できます。
%module test
%typemap(jstype) (XDisplay * dpy, Window win) "java.awt.Component";
%typemap(jtype) (XDisplay * dpy, Window win) "java.awt.Component";
%typemap(jni) (XDisplay * dpy, Window win) "jobject";
%typemap(javain) (XDisplay * dpy, Window win) "$javainput";
%typemap(in,numinputs=1) (XDisplay * dpy, Window win) {
// some JNI to convert $input (jobject) into $1 (dpy) and $2 (win)
}
%inline %{
struct A {
void Attach(XDisplay * dpy, Window win) {}
};
%}
これらの typemap には、余分な労力をかけずXDisplay
にペアリングできる場所ならどこでも機能するという追加の利点があります。Window
すべての JNI が入力された、jawt.h の例から派生した完成した例は次のようになります。
%module test
%{
#include <X11/Xlib.h>
#include <jawt.h>
#include <jawt_md.h>
#include <cassert>
%}
%typemap(jstype) (Display * dpy, Window win) "java.awt.Component";
%typemap(jtype) (Display * dpy, Window win) "java.awt.Component";
%typemap(jni) (Display * dpy, Window win) "jobject";
%typemap(javain) (Display * dpy, Window win) "$javainput";
%typemap(in,noblock=1,numinputs=1) (Display * dpy, Window win) {
// some JNI to convert $input (jobject) into $1 (dpy) and $2 (win)
JAWT awt;
JAWT_DrawingSurface* ds;
JAWT_DrawingSurfaceInfo *dsi;
JAWT_X11DrawingSurfaceInfo* dsi_x11;
jboolean result;
jint lock;
awt.version = JAWT_VERSION_1_3;
result = JAWT_GetAWT(jenv, &awt);
assert(result != JNI_FALSE);
ds = awt.GetDrawingSurface(jenv, $input);
assert(ds != NULL);
lock = ds->Lock(ds);
assert((lock & JAWT_LOCK_ERROR) == 0);
dsi = ds->GetDrawingSurfaceInfo(ds);
dsi_x11 = (JAWT_X11DrawingSurfaceInfo*)dsi->platformInfo;
$1 = dsi_x11->display;
$2 = dsi_x11->drawable;
}
%typemap(freearg) (Display * dpy, Window win) {
ds->FreeDrawingSurfaceInfo(dsi);
ds->Unlock(ds);
awt.FreeDrawingSurface(ds);
}
%inline %{
struct A {
void Attach(Display * dpy, Window win) {}
};
%}
注目すべき 2 つの変更点は、cleanup の呼び出し後に実行される freearg タイプマップの追加とnoblock=1
、ローカルの一時変数を freearg から見えるようにすることです。