2014-06-05 11 views
6

Sto utilizzando un'API C++ di terze parti per il mio progetto e ha funzioni con valori di ritorno con tipi std::vector<int>, std::vector<bool>, std::vector<double>. Ho bisogno di passare variabili con questi tipi a Java. Quindi sto usando JNI e la mia funzione ha valori di ritorno con i tipi jintArray, jbooleanArray, jdoubleArray.convertire il vettore di tipo primitivo C++ nell'array primitivo di tipo java

sto usando seguente codice per convertire double Tipo:

std::vector<double> data; 
//fill data 
jdouble *outArray = &data[0]; 
jdoubleArray outJNIArray = (*env).NewDoubleArray(data.size()); // allocate 
if (NULL == outJNIArray) return NULL; 
(*env).SetDoubleArrayRegion(outJNIArray, 0 , data.size(), outArray); // copy 
return outJNIArray; 

Non ho alcun problema con questo blocco di codice. Ma quando voglio fare questo per int e bool tipi c'è un problema al seguente:

std::vector<int> data; 
//fill data 
jint *outArray = &data[0]; 

e

std::vector<bool> data; 
//fill data 
jboolean *outArray = &data[0]; 

Il problema è con le definizioni di jint e jboolean, dal momento che:

typedef long   jint; 
typedef unsigned char jboolean; 

e per jdouble:

typedef double   jdouble; 

Come, si può vedere la mia soluzione conveniente per double non funziona per int e bool tipi in quanto i loro typedef non corrisponde.

Quindi, la mia domanda è come posso fare questa conversione per tutti i tipi primitivi comodamente?

Grazie in anticipo

+0

Fabbrica una fabbrica? – ChiefTwoPencils

+0

Oh, che cos'è? – guneykayim

risposta

2

Poiché i tipi di dati possono avere dimensioni diverse si deve copiare il vettore. Il modo più semplice per farlo è

std::vector<jboolean> tmp(data.begin(), data.end()); 
jboolean *outArray = &tmp[0]; 

Naturalmente, è possibile allocare il jBooleanArray e impostare gli elementi in un ciclo for o scrivere un wrapper per esso che si comporta come un contenitore STL.