我在C中有一些代碼,其中一個方法有一個函數指針作爲參數。我試圖在我的Android應用程序中使用C代碼。SWIG C函數指針和JAVA
我決定使用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);
}
這裏是我的接口文件乘痛飲。我
%module example
%{
/* Includes the header in the wrapper code */
#include "multiply.h"
%}
/* Parse the header file to generate wrappers */
%include "multiply.h"
然後,我跑到下面痛飲命令生成我需要
swig -java -package com.example.ndktest -o multiply-wrap.c mulitiply-swig.i
然後java文件痛飲生成以下文件:
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));
}
}
exampleJNI.java
package com.example.ndktest;
public class exampleJNI {
public final static native int foo(long jarg1);
}
SWIGTYPE_p_f_int_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_p_f_int_int_int__int
???我不明白我怎麼能傳遞一個Java方法回調的C代碼...我想我肯定是錯過這裏的東西....
任何幫助表示讚賞,感謝
我在Java中編寫了一個類似用例的工作示例:http://stackoverflow.com/a/12251183/168175 – Flexo