関数ポインターのみを含む「インターフェイス」構造を持つヘッダー ファイルがあります。SWIG に (自動的に?) これらの関数ポインタのそれぞれに一致する単一メソッドの Java インターフェイスを生成してもらいたいです。ラップされた C 構造体 (=Java プロキシ クラス) でこれらのインターフェイスを実装するオブジェクトを設定および取得したい。セッターには、Java コールバックをそれが設定されている特定のインスタンスにリンクする追加のロジックが必要です (つまり、マップを介して)。
C/JNI 側では、プロキシ Java クラスの静的 Java メソッドにコールバックする構造体の関数ポインタに C 関数の実装を格納する必要があります。この静的メソッドの実装は、指定された引数を使用し、コールバックとオブジェクト インスタンス間のリンクを使用して、正しい Java コールバックを呼び出すことができます。
この質問が私を始めさせました: Java または C# でコールバックをラップする .i ファイルをどのように記述すればよいですか?
ただし、グローバルに宣言された関数ポインターを使用してそれを行う方法を示しています。私の場合、C 側にグローバルに jobject+JNIEnv を格納することはできません/格納したくありません。
私がこれまでに得たのは、3 つの引数を持つコールバック C 関数の (惨めな) マクロです。
%define CALLBACK_3(jni_cls, jni_mtd_name, jni_mtd_signature, c_mtd_name, c_arg0_type, c_arg_type1, c_arg_type2)
void c_mtd_name ( c_arg0_type c_arg0, c_arg1_type c_arg1, c_arg2_type c_arg2) {
JNIEnv *env;
GET_ENV(env);
jclass j_callback_cls = JCALL1(FindClass, env, jni_cls);
jmethodID j_callback_mtd = JCALL3(GetStaticMethodID,env,j_callback_cls,#jni_mtd_name,#jni_mtd_signature);
//?
$typemap(jni,c_arg0_type) j_arg0 = 0;
$typemap(jni,c_arg1_type) j_arg1 = 0;
$typemap(jni,c_arg2_type) j_arg2 = 0;
$typemap(out,1=c_arg0,result=j_arg0);
$typemap(out,1=c_arg1,result=j_arg1);
$typemap(out,1=c_arg2,result=j_arg2);
//?
JCALL3(CallStaticVoidMethod,env,j_callback_cls,j_callback_mtd,j_arg0,j_arg1,j_arg2);
}
%enddef
苦労する前に、ここで正しいアプローチを取っているかどうかを知りたいと思います。もしそうなら、マクロ内で、特定の C 変数を対応する C JNI 型に変換するように指示するにはどうすればよいですか?