swigc函数指针与JAVA

swigc函数指针与JAVA,java,android,function-pointers,swig,Java,Android,Function Pointers,Swig,我有一些C语言的代码,其中一个方法有一个函数指针作为参数。我正在尝试在我的Android应用程序中使用C代码 我决定使用SWIG来完成生成所需java文件的所有工作。正则函数(没有函数指针作为参数的函数)一切都很好 但我不确定如何将JAVA方法作为回调传递给C函数 以下是一个例子: 这是我的multiply.h文件 typedef int (*callback_t) (int a, int b, int c); int foo(callback_t callback); 这是我的multip

我有一些C语言的代码,其中一个方法有一个函数指针作为参数。我正在尝试在我的Android应用程序中使用C代码

我决定使用SWIG来完成生成所需java文件的所有工作。正则函数(没有函数指针作为参数的函数)一切都很好

但我不确定如何将JAVA方法作为回调传递给C函数

以下是一个例子:

这是我的multiply.h文件

typedef int (*callback_t) (int a, int b, int c);

int foo(callback_t callback);
这是我的multiply.c文件

#include <stdio.h>
#include "multiply.h"

int foo(callback_t callback)
{
    return callback(2, 4, 6);
}
然后我运行下面的swig命令来生成所需的java文件

swig -java -package com.example.ndktest -o multiply-wrap.c mulitiply-swig.i 
然后swig生成了以下文件:

example.java

package com.example.ndktest;

public class example {
  public static int foo(SWIGTYPE_p_f_int_int_int__int callback) {
    return exampleJNI.foo(SWIGTYPE_p_f_int_int_int__int.getCPtr(callback));
  }

}
示例jni.java

package com.example.ndktest;

public class exampleJNI {
  public final static native int foo(long jarg1);
}
SWIGTYPE_p_f_int_int_int.java

package com.example.ndktest;

public class SWIGTYPE_p_f_int_int_int__int {
  private long swigCPtr;

  protected SWIGTYPE_p_f_int_int_int__int(long cPtr, boolean futureUse) {
    swigCPtr = cPtr;
  }

  protected SWIGTYPE_p_f_int_int_int__int() {
    swigCPtr = 0;
  }

  protected static long getCPtr(SWIGTYPE_p_f_int_int_int__int obj) {
    return (obj == null) ? 0 : obj.swigCPtr;
  }
}
现在,如何从java代码中调用这个
foo
方法?参数的类型为
SWIGTYPE\u p\u f\u int\u int\u int
???我不明白如何将JAVA方法作为回调传递给C代码。。。我想我肯定错过了一些东西


非常感谢您的帮助。显然,您不能将一个方法作为参数传递。但通过在接口中实现回调,使用“Director”特性仍然可以进行回调。请参阅。

我在中用Java编写了一个类似用例的工作示例:您有使用C的示例吗?不是cpp?
package com.example.ndktest;

public class SWIGTYPE_p_f_int_int_int__int {
  private long swigCPtr;

  protected SWIGTYPE_p_f_int_int_int__int(long cPtr, boolean futureUse) {
    swigCPtr = cPtr;
  }

  protected SWIGTYPE_p_f_int_int_int__int() {
    swigCPtr = 0;
  }

  protected static long getCPtr(SWIGTYPE_p_f_int_int_int__int obj) {
    return (obj == null) ? 0 : obj.swigCPtr;
  }
}