我有一个带有“接口”结构的头文件,它只包含函数指针。我希望SWIG(自动?)为每个这些函数指针生成匹配的单一方法Java接口。我想设置&获取在包装的C结构(= Java代理类)上实现这些接口的对象。 setter应该有额外的逻辑,将Java回调链接到它所设置的特定实例(即通过映射)。
在C / JNI端,C函数实现应该存储在struct的函数指针中,该函数指针回调到代理java类的静态Java方法。然后,这个静态方法的实现可以使用它给定的参数并使用回调和放大器之间的链接。对象实例,用于调用正确的java回调。
这个问题让我开始:How should I write the .i file to wrap callbacks in Java or C#
然而,它演示了如何使用全局声明的函数指针&在我的情况下,我可以/不想在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类型?