如何使用SWIG宏将C回调生成java方法?

如何使用SWIG宏将C回调生成java方法?,java,java-native-interface,swig,Java,Java Native Interface,Swig,我有一个带有“接口”结构的头文件,它只包含函数指针。我希望SWIG(自动地?)为每个函数指针生成一个匹配的单一方法Java接口。我想设置并获取在包装的C结构(=Java代理类)上实现这些接口的对象。setter应该有额外的逻辑将Java回调链接到它所设置的特定实例(即通过映射) 在C/JNI端,C函数实现应该存储在结构的函数指针中,该指针回调到代理Java类的静态Java方法中。然后,这个静态方法的实现可以使用它给定的参数并使用回调与对象实例之间的链接来调用正确的java回调 这个问题让我开始思

我有一个带有“接口”结构的头文件,它只包含函数指针。我希望SWIG(自动地?)为每个函数指针生成一个匹配的单一方法Java接口。我想设置并获取在包装的C结构(=Java代理类)上实现这些接口的对象。setter应该有额外的逻辑将Java回调链接到它所设置的特定实例(即通过映射)

在C/JNI端,C函数实现应该存储在结构的函数指针中,该指针回调到代理Java类的静态Java方法中。然后,这个静态方法的实现可以使用它给定的参数并使用回调与对象实例之间的链接来调用正确的java回调

这个问题让我开始思考:

然而,它演示了如何使用全局声明的函数指针来实现这一点&在我的例子中,我可以/不希望在C端全局存储jobject+JNIEnv

到目前为止,我得到的是一个(糟糕的)回调C函数宏,它有3个参数:

%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类型