2014-06-05 13 views
6

Używam API C++ innej firmy do mojego projektu i ma funkcje zwracające wartości z typami std::vector<int>, std::vector<bool>, std::vector<double>. Muszę przekazać zmienne z tymi typami do Javy. Używam więc JNI i moja funkcja zwraca wartości z typami jintArray, jbooleanArray, jdoubleArray.Konwertuj podstawowy wektor typu C++ na prymitywny typ tablicy java

Używam następujący kod do konwersji double typ:

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; 

mam żadnego problemu z tego bloku kodu. Ale kiedy chcę to zrobić dla int i bool typów pojawia się problem, co następuje:

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

i

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

Problem jest z definicji jint i jboolean, ponieważ:

typedef long   jint; 
typedef unsigned char jboolean; 

i dla jdouble:

typedef double   jdouble; 

Jak widać mój wygodne rozwiązanie dla double nie działa int i bool typów od ich typedefs nie pasują.

Więc moje pytanie brzmi: w jaki sposób mogę to zrobić konwersję wszystkich typów pierwotnych dogodnie?

góry dzięki

+0

Zrobisz fabrykę? – ChiefTwoPencils

+0

Och, co to jest? – guneykayim

Odpowiedz

2

Ponieważ typy danych mogą mieć różne rozmiary należy skopiować wektor. Najprostszym sposobem na to jest

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

Oczywiście, można przeznaczyć jBooleanArray i ustawić elementy w pętli for lub napisać otoki dla niego, że zachowuje się jak kontenera STL.