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
Ho scritto un esempio funzionante di un caso di utilizzo simile in Java all'indirizzo: http://stackoverflow.com/a/12251183/168175 – Flexo