2013-12-12 100 views
5

我在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代碼...我想我肯定是錯過這裏的東西....

任何幫助表示讚賞,感謝

+2

我在Java中編寫了一個類似用例的工作示例:http://stackoverflow.com/a/12251183/168175 – Flexo

回答

0

顯然,你不能傳遞單一方法作爲參數。但是通過在接口中實現回調,使用「Director」功能仍然可以實現回調。請參閱this example

+3

您是否有C示例?不是cpp? – pdiddy