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