2013-12-12 13 views
5

Ho un codice in C e uno dei metodi ha un puntatore a funzione come argomento. Sto cercando di usare il codice C nella mia app per Android.Puntatore funzione SWIG C e JAVA

Ho deciso di utilizzare SWIG per fare tutto il lavoro necessario per generare i file java di cui ho bisogno. Tutto funziona bene con una funzione regolare (quella che non ha un puntatore a funzione come argomento).

Ma non sono sicuro di come passare il metodo JAVA come richiamo alla funzione C.

Ecco un esempio:

Ecco il mio file di multiply.h

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

int foo(callback_t callback); 

qui è il mio file multiply.c

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

int foo(callback_t callback) 
{ 
    return callback(2, 4, 6); 
} 

ecco il mio file di interfaccia si moltiplicano-sorso. i

%module example 
%{ 
/* Includes the header in the wrapper code */ 
#include "multiply.h" 
%} 

/* Parse the header file to generate wrappers */ 
%include "multiply.h" 

Poi ho eseguito il seguente comando sorso per generare i file java che ho bisogno

swig -java -package com.example.ndktest -o multiply-wrap.c mulitiply-swig.i 

e poi sorso generato i seguenti file:

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; 
    } 
} 

Ora, come posso chiamare questo metodo foo dal mio codice java? L'argomento è di tipo SWIGTYPE_p_f_int_int_int__int ??? Non capisco come posso passare un metodo Java come callback al codice C ... Penso di sicuramente manca qualcosa qui ....

ogni aiuto è apprezzato, grazie

+2

Ho scritto un esempio funzionante di un caso di utilizzo simile in Java all'indirizzo: http://stackoverflow.com/a/12251183/168175 – Flexo

risposta

0

Ovviamente, non può passare un singolo metodo come argomento. Ma i callback sono ancora possibili con la funzione "Director" tramite l'implementazione della callback in un'interfaccia. Vedi this example.

+3

Hai un esempio con C? non cpp? – pdiddy